任意のタプルの各要素に対して、テンプレートまたはオーバーロードされた関数を呼び出す必要があります。正確には、タプルで指定されている要素に対してこの関数を呼び出す必要があります。
例えば。私はタプルstd::tuple<int, float> t{1, 2.0f};
と関数を持っています
class Lambda{
public:
template<class T>
void operator()(T arg){ std::cout << arg << "; "; }
};
struct/function が必要ですApply
。これを呼び出すと、次のようApply<Lambda, int, float>()(Lambda(), t)
になります。
1; 2.0f;
ではない2.0f; 1;
。
「生の」パラメーターパックが関数に渡され、タプルに対して逆の順序でそれを行う方法を知っている場合、私は解決策を知っていることに注意してください。しかし、部分的に特殊化する次の試みはApply
失敗します。
template<class Func, size_t index, class ...Components>
class ForwardsApplicator{
public:
void operator()(Func func, const std::tuple<Components...>& t){
func(std::get<index>(t));
ForwardsApplicator<Func, index + 1, Components...>()(func, t);
}
};
template<class Func, class... Components>
class ForwardsApplicator < Func, sizeof...(Components), Components... > {
public:
void operator()(Func func, const std::tuple<Components...>& t){}
};
int main{
ForwardsApplicator<Lambda, 0, int, float>()(Lambda{}, std::make_tuple(1, 2.0f));
}
コードはコンパイルされますが、最初の引数のみが出力されます。ただし、ForwardsApplicator
専門分野を次のように置き換えると、
template<class Func, class... Components>
class ForwardsApplicator < Func, 2, Components... >{...}
それは正しく動作します - もちろん、長さ 2 のタプルに対してのみです。可能であれば、エレガントに - 任意の長さのタプルに対してどのように行うのですか?
編集:答えてくれてありがとう!3 つすべてが本当に的を射ており、考えられるすべての観点から問題を説明しています。