**関数を純粋汎用にするためのいくつかの提案がありますが、これは機能しますが、Baseとその子のみを受け入れるように関数を制限したいと思います。
可変個引数テンプレートクラスの基本型の引数を受け入れることができる関数を作成するのに問題がありますが、関数は実際にはBaseから派生したクラスで呼び出されます。私はいくつかのことを試しました。これが一般的な考え方です。与えられた:
template<typename... Args> struct Base {
std::tuple<Args...> data;
... //other stuff
};
struct DerivedA : Base<string, int> {
};
struct DerviedB : Base<bool, string, int> {
};
これを行う関数を作成する正しい方法は何ですか?
string moosh_together(Base A, Base B) { //I only need access to Base's members
return get<0>(A.data) + get<1>(B.data);
}
main() {
DerivedA aThing;
get<0>(aThing.data) = "foo";
DerivedB bThing;
get<1>(bThing.data) = "bar'd";
cout << moosh_together(aThing, bThing) << endl;
}
出力:
foobar'd
moosh_together関数のいくつかのバリエーションを試しましたが、どれも機能しません。上記のままにしておくと、テンプレート引数の欠落に関するコンパイラエラーが発生します。DerivedAとDerivedBを定義するテンプレート引数を関数に渡す方法がわかりません。
私が試した他のこと(ショットガン法):
string moosh_together(Base<> A, Base<> B) {}
//err: conversion from 'DerivedA' to non-scalar type 'Base<>' requested
template<Base<typename... Args> T1, Base<typename... Args> T2>
string moosh_together(T1 A, T2 B) {}
//err: expected paramter pack before '...'
template<Base<Args...> T1, Base<Args...> T2>
string moosh_together(T1 A, T2 B) {}
//err: 'Args' was not declared in this scope