std::tuple
允許您將呼叫所需的參數打包到foo
。正如其他人已經指出的那樣,有幾種方法可以調用你的函數,其中一些方法可能需要更新的標準。
在C++ 11中,你已經有了std::bind
這應該適合你的需求,在你的情況下就好了。這裏有一個如何這可以實現一個例子:
#include <iostream>
#include <functional>
#include <tuple>
class MyClass {};
std::tuple<int, float, MyClass> get_arguments()
{
int a = 0;
float b = 1.0f;
MyClass c;
// ... calculate parameters;
return std::make_tuple(a, b, c);
}
void foo(int a, float b, MyClass c)
{
std::cout << "a: " << a << ", b: " << b << "\n";
}
int main(int argc, char* argv[])
{
// get tuple holding arguments
auto arguments = get_arguments();
// Binding arguments and calling directly
std::bind(
foo,
std::get<0>(arguments),
std::get<1>(arguments),
std::get<2>(arguments))();
return 0;
}
你可以把std::bind
呼叫到一個包裝,特別是當你使用它頻繁。
如果最終傳遞來回參數包,將它們封裝到它們自己的數據類型甚至函數對象中可能是有意義的。此方法不需要std::tuple
和std::bind
,因此即使您無法訪問C++ 11,也可以使用該方法。
#include <iostream>
class MyClass {};
void foo(int a, float b, MyClass c)
{
std::cout << "a: " << a << ", b: " << b << "\n";
}
class FooCaller
{
public:
void operator()(void) const
{
foo(a, b, c);
}
int a;
float b;
MyClass c;
};
void get_arguments(FooCaller& fooCaller)
{
// ... calculate parameters;
fooCaller.a = 0.0f;
fooCaller.b = 1.0f;
}
int main(int argc, char* argv[])
{
// Create Instance and calculate/retrieve arguments
FooCaller fooCaller;
get_arguments(fooCaller);
// call 'foo'
fooCaller();
return 0;
}
這可能是更加通用的,但是這可能需要在介紹了C++ 11後來一些模板元編程功能。
爲什麼需要通過返回值?另一種方法是通過引用'get_arguments'來傳遞'a','b'和'c',然後你可以簡單地調用'foo(a,b,c)'。爲了讓它成爲一個返回值或者使用std :: apply來查看元組對於靜態情況似乎沒有必要,因爲這樣做,不是嗎? –
直接調用foo和您的解決方案有什麼不同? –
不同之處在於,您將責任交給另一個函數來填充參數,這正是您在問題中提出的問題,不是嗎? –