2016-10-08 21 views
11

抽象基本クラスを一般的なケースで実装する方法コードは私が取り組んでいるライブラリから単純化されています。したがって、intとdoubleの明示的な実装はオプションではありません。抽象クラスが可変的コンテキストで使用されるときに抽象メソッドを実装する方法

template <typename T> 
struct Foo 
{ 
    virtual void send(T t) = 0; 
}; 

template <typename...T> 
struct Bar : Foo<T>... 
{ 
    void send(T t) override { // does not compile because 
          // abstract method not implemented 
    } 
}; 

int main() { 
    // example usage 
    Bar<int, double> b; 

    b.send(1); 
    b.send(2.3); 
} 

事前に感謝します。

:抽象メソッドに仮想を追加しました。

答えて

6

次の例はどうなりますか?

まず、virtualsend()メソッドをFooに定義する必要があると思います(純粋な仮想の場合)。

次は、overridesend()

最後を実装する、あなたは正しい仮想send()方法を選択するために、Barにテンプレートsend()メソッドを使用することができ、中間テンプレートクラス(Foo2)を宣言することができます。

#include <iostream> 

template <typename T> 
struct Foo 
{ virtual void send(T t) = 0; }; 

template <typename T> 
struct Foo2 : Foo<T> 
{ 
    void send(T) override 
    { std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; } 
}; 

template <typename...T> 
struct Bar : Foo2<T>... 
{ 
    template <typename U> 
    void send (U u) 
    { Foo2<U>::send(u); } 
}; 

int main() 
{ 
    Bar<int, double> b; 

    b.send(1); // print sizeof[4] 
    b.send(2.3); // print sizeof[8] 
} 
+0

ねえ、あなたは違いが間にあるものを私に伝えることができます: 'foo2は ...'と 'foo2は'(括弧内のブラケット対外ドット) – Brandon

+0

@Brandon - 全く異なるものです。 'Foo2 'と書くと、 'Foo2 'という基本クラスを 'sizeof ...(T)'というテンプレートパラメータで宣言します。 'Foo2 ...'と書いた場合、 'Foo2 、Foo2 、Foo2 /* etc * /'のような基本テンプレートを 'sizeof ...(T)'と宣言します – max66

関連する問題