![](/img/trans.png)
[英]How can I pass a function as argument regardless of its return type in C++ ? (without using a template parameter for the passed function)
[英]c++ How can i save function return type for lambda function without template?
我正在尝试创建 class 可以保存 function 指针、arguments 和返回类型。
我的 class 保存 function
// Here i can't pass temlpate because next step for me is creating array of CFnSaver ('std::vector<CFnSaver*>')
// template<typename T>
class CFnSaver
{
public:
// i can't use template here, compiler throw an error
// template<typename T>
std::function<int()> savedFn;
template<typename ... Args>
constexpr bool Save(void* pFn, Args ... args)
{
if (!pFn) return false;
// creating lambda function
auto lambdaFn = [pFn, args...]()
{
// I need to get function return type, not just hardcode 'int' (as i did)
using tempFn = int(*)(Args ...);
auto tempFunc = reinterpret_cast<tempFn>(pFn);
return tempFunc(args...);
};
// Here i can call original function and get result, e.g. '5', but i don't need it here
// auto res = lambdaFn();
// saving lambda to std::function
savedFn = lambdaFn;
return !!savedFn;
}
inline CFnSaver() {};
template<typename ... Args>
inline CFnSaver(void* pFn, Args ... args) { Save(pFn, args...); }
bool const operator ! () const { return(!savedFn); }
explicit operator bool() const { return !!savedFn; }
};
使用示例:
int printSum(int a, int b)
{
int sum = a + b;
printf_s("%d\n", sum);
return sum;
}
int main()
{
CFnSaver cfn(printSum, 2, 3);
// I need to get return of this function (now it's hardcoded to int)
auto res = cfn.savedFn();
return 0;
}
我还可以创建另一个版本的 function,将另一个变量作为 ref 传递。 但我对此并不满意。
void printSum(int a, int b, int& result)
{
int sum = a + b;
printf_s("%d\n", sum);
result = sum;
}
int main()
{
int result = 0;
CFnSaver cfn(printSum, 2, 3, result);
cfn.savedFn();
return 0;
}
我想我需要另一种方法来保存 function 或者我错过了一些方法来做到这一点,我们将不胜感激。
对不起,我的英语不好。
我试过模板 class、模板 function,将变量作为 ref 传递。
可悲的是,我认为不使用模板是不可能的。
我的建议是不要使用保存函数的数组,而是创建一个 lambda 来调用它们并使用它。 lambda 甚至可以采用布尔值数组来指定是否在必要时调用特定函数。
编辑:
如果返回类型相同,或者函数可以分组到具有相同返回类型的列表中,则可以使用std::bind
。 如果:
std::vector<std::function<int()> vec {
AddNumbers, // AddNumbers(int, int) adds two numbers
std::bind(AddNumbers, std::placeholders::_1, 3) // Adds three to a number, usage example: vec[1](2); would return 5
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.