2017-08-29 62 views
0

我试图从传递给它的类构造函数的参数类型中推导出一个成员变量的类型。该类的构造函数(PublishSubscribe类)接收两个参数,每个参数表示可变类型(一个用于发送的可变参数包,一个用于接收)。从传递给构造函数的参数类型推导可变参数成员类型

我试图获取工作的代码如下:

#include <tuple> 

template <typename... Types> 
struct TopicTypes {}; 

TopicTypes<int> type_subscribe_topics; 
TopicTypes<int,double> type_publish_topics; 

template <typename... TReceives> 
class PublishSubscribe 
{ 
    public: 
    template < typename... TReceives, template <typename...> class TR, 
       typename... TSends,  template <typename...> class TS> 
    PublishSubscribe(const TR<TReceives...>&, 
        const TS<TSends...>&){} 

    private: 
    std::tuple<TReceives...> member_; 
}; 

class UserClass : public PublishSubscribe{ 
    public: 
    UserClass() 
     : PublishSubscribe(
       type_subscribe_topics, 
       type_publish_topics 
     ){} 
}; 

int main() 
{ 
    return 0; 
} 

我得到下面的编译错误:

variadic3.cpp:13:17: error: declaration of 'class ... TReceives' 
    template < typename... TReceives, template <typename...> class TR, 
       ^
variadic3.cpp:9:11: error: shadows template parm 'class ... TReceives' 
template <typename ... TReceives> 

一个如何将与模板类型的PublishSubscribe类type_subscribe_topics?我需要PublishSubscribe<magic(decltype(type_subscribe_topics))>这将默认为PublishSubscribe<int>在这种特殊情况下。

非常感谢提前!

回答

2

您不能在类模板和成员函数模板中使用相同的模板名称。你有

template <typename... TReceives> 
class PublishSubscribe 

template < typename... TReceives, template <typename...> class TR, 
      typename... TSends,  template <typename...> class TS> 
PublishSubscribe(const TR<TReceives...>&, 
       const TS<TSends...>&){}  

哪个都使用TReceives。你要么需要的模板之一更改名称,或者,如果您使用的是你传给你可以得到从功能摆脱它的类TReceives它看起来像

template <       template <typename...> class TR, 
      typename... TSends,  template <typename...> class TS> 
PublishSubscribe(const TR<TReceives...>&, 
       const TS<TSends...>&){} 

您不能使用构造函数的模板参数来定义元组应该使用的类型。你可以做类一般较少,只是需要一个元组像

template <typename T> 
class PublishSubscribe 

,然后你可以使用它像

PublishSubscribe<decltype(some_tuple)> foo(some_tuple, some_other_tuple); 

member_只想成为T member_;

+0

权!我使用相同的类型,因为我希望member_变量具有与传递给构造函数的参数类型相同的类型。 –

+1

@MihaiGalos哦,我不确定你能做到这一点。 AFAIK成员变量不能依赖于成员函数模板参数,因为在编译类时这是不知道的。 – NathanOliver

+0

Humm。我懂了。在这里可以做些什么来为模板type_subscribe_topics *和* PublishSubscribe创建一个“通用”模板? –

相关问题