関数またはメソッドは、パラメータパックを返すことはできません。
機能は、しかし、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.
}
私が実際にやりたいことは、基本クラスに広告する各「キー」のgettorsを実装するために派生クラスが必要であることです。 私はそれらを手動で特殊化すると、派生クラスが変更されるたびにベースクラスを書き直すことになります。 パックの各タイプごとに1つのメソッドを取得する方法はありますか? – SaburoutaMishima
あなたの説明に答えて、私の答えを更新しました。 –
うわー。あなたはその答えを更新したことがありますか?それは私が探しているもののようです。 この解釈は正しいですか? 'getcontents_base'が特殊化されるたびに、コンパイラはgetBarの特殊化を定義します。 これが完了するまでに、継承グラフの各getcontents_base <>はgetBarの1バージョンを持ち、getcontentsが最初に渡されたすべての型を考慮していますか? – SaburoutaMishima