我正在尝试将函数绑定到类型中-考虑以下测试程序:
#include <utility>
template <class Ret, class Arg>
struct func {
typedef Ret (&ref)(Arg);
template <ref Fn>
struct bind {
template <class NewArg>
Ret operator()(NewArg&& arg) {
return Fn(std::forward<Arg>(arg));
}
};
};
int foo(int i) {
return i;
}
typedef func<int, int>::bind<foo> Foo;
int main(int argc, char** argv) {
Foo foo_obj;
return foo_obj(argc);
}
这行得通,但我个人觉得func<int, int>::bind<foo>
丑陋,而且它也是多余的 - 但我似乎无法func::bind<foo>
从模板参数中推断出 Ret 和 Arg 来绑定(或道德等价的 therof)。我会做这样的事情:
template <class Ret, class Arg>
constexpr auto bind_func(typename func<Ret, Arg>::ref f) -> typename func<Ret, Arg>::bind<f> {
return {};
}
但是,由于 f 不能保证是常量表达式,因此无法编译,因为编译器无法知道 f 是有效的模板参数。
有没有办法在没有持续冗余的情况下做到这一点?