- 最初の引数
- 可変引数テンプレートを使用して、任意のタイプの任意の数の引数を受け入れるよう任意の呼び出し可能な関数を受け入れます。
- 完璧な転送を使用します。
http://ideone.com/z2kLUx
int HelloWorld(string var1, const char* var2)
{
cout << var1 << " " << var2 << endl;
return 5;
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args)
{
return fn(forward<Args>(args)...);
}
int main()
{
cout << "Value returned: " << CallFunction(HelloWorld,"Hello","World");
return 0;
}
これは欠点があり、単純なバージョンです:あなたは非voidを返す関数を指定する必要がありますが、これは簡単に修正することができます。簡単な修正は、異なる名前のvoidを返す別のCallFunctionを作成するか、std::enable_if
を使用します。
http://ideone.com/El3WUi
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
fn(forward<Args>(args)...);
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<!is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
return fn(forward<Args>(args)...);
}
出典
2016-03-31 16:07:40
Jts
[std :: bind](http://en.cppreference.com/w/cpp/utility/functional/bind)。 – songyuanyao
@songyuanyaoは、その文字列の情報を文字列として得ることができます。呼び出されている関数のbañe? –
申し訳ありませんが、 'bañe'とは何ですか? – songyuanyao