假设我有以下代码:
#include <iostream>
#include <functional>
template <int func(int)>
struct S : std::unary_function<int, int>
{
int operator()(int x) const
{
return func(x);
}
};
int foo(int x)
{
return x;
}
int main()
{
S<foo> s;
std::cout << s(42) << std::endl;
}
这可以作为将函数包装在函子内的一种方式,这意味着它可以在其他模板化函数中使用(例如sort
,例如(假设函子具有正确的签名))。我不想为每种可能的返回/参数类型创建一个仿函数结构(实际上我不能),所以我尝试了以下方法:
template <template <typename R, // Make the return type and argument type template parameters!
typename A> R func(A)>
struct S : std::unary_function<R, A>
{
R operator()(A arg) const
{
return func(arg);
}
};
那没有用;它给了我编译错误。所以我尝试了:
template <typename R, typename A, R func(A)>
struct S : std::unary_function<R, A>
{
R operator()(A arg) const
{
return func(arg);
}
};
哪个起作用了。不幸的是,我不得不将实例更改S
为 beS<int, int, foo> s;
而不是 nicer S<foo> s;
。
是否有可能将作为模板参数传递的函数模板化,这样我就可以做到S<foo> s;
而不是硬编码函数的返回类型和参数类型S
?
我的 google-foo 无法找到具体的答案。
编辑:现在我想知道这是否不可能。我只是想到“如果foo
是重载函数怎么办?” 据我所知,没有一种方法可以知道在说时使用哪种方法, 因此需要明确说明返回/参数类型。这是正确的想法吗?这是否意味着我的第一个问题的答案是“不,这不可能”?foo
S<foo> s;