2017-08-29 41 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創建一個「通用」模板? –

相關問題