gpt4 book ai didi

c++ - 没有模板重新绑定(bind)的 typedef 模板。作为模板类参数的模板使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:36 26 4
gpt4 key购买 nike

我想做这样的事情:

template<class T>
class BaseSubscriber {};

template<class T>
class BasePublisher
{
// not working : invalid use of template-name 'BaseSubscriber' without an argument list
typedef BaseSubscriber SubscriberType;

// compiling
typedef BaseSubscriber<T> SubscriberTypeT;
};


template< template<class T> class Subscriber, class Data >
class ClassA:
public Subscriber<Data>
{
};

template< template<class T> class Publisher, class Data >
class ClassB:
public Publisher<Data>
{
// Ok, but I want that the type "BaseSubscriber" depends on the template parameter Publisher
void method1(ClassA<BaseSubscriber, Data>&);


// I want something like that. But how to define SubscriberType ?
void method2(ClassA<Publisher<Data>::SubscriberType, Data>&);
// or (SubscriberType only depends on the Publisher, nor on the Data)
void method2(ClassA<Publisher::SubscriberType, Data>&);


// Error : template argument is invalid
void method3(ClassA<Publisher::SubscriberTypeT, Data>&);
};

是否可以定义一些我可以用于 classA 模板参数的 SubscriberType?或者有什么解决办法吗?

如果可能的话,我想保留 classA 原型(prototype)。我不想改变它

template<class TSubscriber > classA {};

而且我不能使用 C++11。非常感谢您的回答。

最佳答案

当你说的时候,你的意思有点困惑:

// I want something like that. But how to define SubscriberType ?
void method2(ClassA<Publisher::SubscriberType>);

因为 Publisher 是一个模板,但您没有向它传递任何参数。

无论如何,这里有一些选择:

在 C++11 中,您可以使用模板别名:

template<class T>
class BasePublisher
{
template<typename U>
using SubscriberType = BaseSubscriber<U>;
};

你也可以使用嵌套类:

template<class T>
class BaseSubscriber {};

template<class T>
class BasePublisher
{
template<class U>
class BaseSubscriber {};
};

或者更改 ClassA 以使用 type 成员:

template<class T>
class BasePublisher
{
template<class U>
struct SubscriberType {
typedef BaseSubscriber<U> type;
};
};

template< template<class T> class SubscriberT >
class ClassA {
typedef typename SubscriberT::type Subscriber;
};

或者如果您不需要别名,有时继承会起作用:

template<class T>
class BasePublisher
{
template<class U>
struct SubscriberType : BaseSubscriber<U> {};
};

关于c++ - 没有模板重新绑定(bind)的 typedef 模板。作为模板类参数的模板使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13267121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com