// some arbitrary function
template<typename T>
void log(T&& obj)
{
std::cout << obj << std::endl;
}
// arbitrary transformation
template<typename T>
T convert(T&& obj) {
return obj;
}
template<template <typename> typename F, typename... T>
void callOn(F<T> func, /// issue: what's the type of func?
T&&... params)
{
func(std::forward<T>(convert(std::forward<T>(params)))...);
}
int main()
{
callOn(log, -1, -2.0);
return 0;
}
これはまったく可能ですか?テンプレートテンプレート関数の可変パラメータを展開しますか?
コンパイラが「callOn(、.. ..」)の呼び出しに一致する関数がありません。どうして ?
更新:仮定するログは
template<typename T>
void log(T&& value) { std::cout << value << std::endl; }
template<typename First, typename... Rest>
void log(First&& f, Rest&&... rest)
{
std::cout << f << ",";
log(std::forward<Rest>(rest)...);
}
単項関数ではありませんcallOnは、ログの種類が一致しない「テンプレート」と入力取りますか? funcの種類を指定するには?
メタメタプログラミングですか?私たちはもっと深く行かなければなりません! –
野生の推測: 'template typename F'を試してみましたか? –
Philipp
@Philipp:これも私の考えでしたが、 'callOn(log、-1、-2.0);'は 'log'に2つの引数を渡そうとします。これは単項式です。 – ildjarn