带有类名的变量模板

时间:2015-06-16 08:19:33

标签: c++ templates variadic-templates

我有这个模板

template <typename T> 
class Publisher
{
public:
    Publisher(){}
    ~Publisher(){}
}

我有这个可变参数模板

template <typename First, typename... Rest>
class PublisherContainer
{
    PublisherContainer();
    ~PublisherContainer();
}

PublisherContainer构造函数中,我想为每个模板参数创建一个Publisher

template <typename First, typename... Rest>
PublisherContainer<First, Rest...>::PublisherContainer()
{
    Publisher<First> publisher;
    // create other publisher here.
}

所以我可以做到

PublisherContainer<ClassA, ClassB, ClassC> myPublisher;

如何为每个模板参数调用Publisher

2 个答案:

答案 0 :(得分:1)

类模板不能包含“pack members”。必须转发或解压缩参数包;它们不能像类型那样使用。

最简单的答案是不重新发明轮子并使用purpuse构建的产品类型if(isset($_POST['sign-up'][0]) && !empty($_POST['sign-up'][0])) { $signUp = 'Yes'; } else { $signUp = 'No'; }

std::tuple

(注意“容器”可能是一个坏名字,因为在标准C ++的习语中,容器是模拟可迭代元素范围的东西。元组是一个产品(“每个”中的一个),而不是范围。也许“PublisherHolder”更合适,或完全删除包装层并直接使用元组。)

答案 1 :(得分:0)

Kerrek SB的回答是半正确的。这是正确的,你不能以你目前正在尝试这样做的方式拥有打包成员,但你可以继承。

首先我们将定义一个基类:

template<typename T>
class PublisherBase{
    public:
        int some_member;
        void some_method(){}
};

然后我们需要一个类来包含我们的基础:

template<typename T>
class Publisher{
    public:
        PublisherBase<T> self;
};
然后我们创建我们的持有人或容器&#39;

template<typename First, typename ... Rest>
class PublisherContainer: public Publisher<First>, Publisher<Rest>...{};

我们可以这样使用:

int main(int argc, char *argv[]){
    PublisherContainer<int, float, double, short> container;
    container.Publisher<float>::self.some_method();
    container.Publisher<short>::self.some_member = 5;
}

语法有点奇怪,但它实现了你的要求。这种方法的唯一问题是每种类型只限于一个发布者;但这也许是可取的。