2017-08-29 16 views
0

メンバ変数の型を、そのクラスのコンストラクタに渡される引数の型から推測しようとしています。クラスのコンストラクター(PublishSubscribeクラス)は、2つのパラメーターを受け取ります。それぞれのパラメーターは、可変型(送信用に1つ、受信用に1つ)です。コンストラクタに渡される引数の型から変数のメンバ型を控除する

私が働いて取得しようとしているコードは以下の通りです:

#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 

との両方がTReceivesを使用

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

を持っています。あなたはあなただけ

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

ようになり、関数からそれを取り除くことができますクラスに渡さTReceivesを使用している場合は、テンプレートの一つに名前を変更する必要があるかのどちらかmember_タプルが使用する型を定義するために、コンストラクタのテンプレートパラメータを使用することはできません。あなたはクラスが少なく、一般的にするとちょうど

template <typename T> 
class PublishSubscribe 

のようなタプルを取り、その後、あなただけのT member_;

+0

右になる

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

member_のようにそれを使用することができます!私はmember_変数がコンストラクタに渡されるパラメータの型と同じ型を持つようにしたいので、同じ型を使用しています。 –

+1

@MihaiGalosああ、私はあなたがそれをすることができるかどうかはわかりません。 AFAIKメンバ変数は、メンバ関数のテンプレートパラメータに依存できません。これは、クラスのコンパイル時には分かりません。 – NathanOliver

+0

ハム。そうですか。 type_subscribe_topics *と* PublishSubscribeの両方をテンプレート化するための「汎用」テンプレートを作成するには、ここで何ができますか? –

関連する問題