I want to pass a function value as a template parameter to a function. Currently the best I managed to do is :
template< typename F, F f >
It's now possible in C++17 with template
:
template
struct FuncWrapper final
{
template
auto operator()(Args &&... args) const
{
return Func(std::forward(args)...);
}
};
int add(int a, int b)
{
return a + b;
}
int main()
{
FuncWrapper wrapper;
return wrapper(12, 34);
}
Demo: https://godbolt.org/g/B7W56t
You can use #ifdef __cpp_nontype_template_parameter_auto
to detect compiler support for this in your code.
If you are able to use C++20 and you want better error messages, you can also use concepts:
template
concept CanAddTwoNumbers = std::is_invocable_r_v;
template
requires CanAddTwoNumbers
struct AddTwoNumbersWrapper final
{
auto operator()(int a, int b) const
-> int
{
return std::invoke(Func, a, b);
}
};
int add(int a, int b)
{
return a + b;
}
int main()
{
AddTwoNumbersWrapper wrapper;
return wrapper(12, 34);
AddTwoNumbersWrapper<123> bad; //error: constraint failure
}
Demo: https://gcc.godbolt.org/z/ai3WGH