2016-05-07 6 views

答えて

1

関数またはメソッドは、パラメータパックを返すことはできません。

機能は、しかし、std::tupleを返すことができます。

template<class... keys> 
struct something { 
    virtual std::tuple<keys...> getContents(foo* Foo) const = 0; 
} 

あなたはまた、単一のタイプのために、このテンプレートを特化し、タイプの代わりに、1要素のタプルを返すことができます。空のパラメーターパックに特化し、voidを返します。

編集:

質問が明確になりました。あなたは何か違うことをしようとしていましたが、最初の説明は明らかに多少なりとも分かりませんでした。

あなたは見ているものを達成することができますが、もう少し複雑で、再帰的なテンプレートと特殊化が必要ですが、これはあなたの望むものです。

class bar; 

template<typename ...Keys> struct getcontents_base; 

template<> 
struct getcontents_base<> { 
}; 

template<typename firstKey, typename ...remainingKeys> 
struct getcontents_base<firstKey, remainingKeys...> 
    : getcontents_base<remainingKeys...> { 

    virtual bar *getBar(firstKey *foo) const=0; 
}; 

struct getcontents : public getcontents_base<int, char> { 

    bar *getBar(int *) const override {} 
    bar *getBar(char *) const override {} 
}; 

struct notgetcontents : public getcontents_base<int, char> {}; 

void foo() 
{ 
    struct getcontents c; // This will compile fine. 

    struct notgetcontents c2; // This will result in a compilation error 
           // because the virtual methods have not 
           // been defined. 
} 
+0

私が実際にやりたいことは、基本クラスに広告する各「キー」のgettorsを実装するために派生クラスが必要であることです。 私はそれらを手動で特殊化すると、派生クラスが変更されるたびにベースクラスを書き直すことになります。 パックの各タイプごとに1つのメソッドを取得する方法はありますか? – SaburoutaMishima

+0

あなたの説明に答えて、私の答えを更新しました。 –

+0

うわー。あなたはその答えを更新したことがありますか?それは私が探しているもののようです。 この解釈は正しいですか? 'getcontents_base'が特殊化されるたびに、コンパイラはgetBarの特殊化を定義します。 これが完了するまでに、継承グラフの各getcontents_base <>はgetBarの1バージョンを持ち、getcontentsが最初に渡されたすべての型を考慮していますか? – SaburoutaMishima

関連する問題