Pet*_*man 2 c++ templates c++17
这是我要工作的代码:
template <class T> void Foo(T&& param);
template <class F> void CallMe(F&& func)
{
func(42);
}
int main()
{
CallMe(Foo);
}
Run Code Online (Sandbox Code Playgroud)
编译器尝试实例化时会窒息,CallMe因为它不知道我的意思Foo。如果我写Foo<int>当然可以,但是我想避免这种情况,因为在实际代码中,模板参数可能很复杂。
我当前的解决方法是使用可调用对象而不是自由函数。例如:
class Foo
{
public:
template <class T> void operator()(T&&);
};
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是我敢肯定,这会使我的图书馆用户感到困惑。我可以使用一些模板魔术来使第一个版本正常工作吗?
我可以使用一些模板魔术来使第一个版本正常工作吗?
我希望。我希望有一天。在这方面有一些建议(例如P0119和P0834)。在此之前,您最好的办法是编写一个提升宏,以将您的名称转换为调用该名称的函数对象:
#define FWD(...) std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)
#define LIFT(name) [&](auto&&... args) \
noexcept(noexcept(name(FWD(args)...))) \
-> decltype(name(FWD(args)...)) \
{ return name(FWD(args)...); }
Run Code Online (Sandbox Code Playgroud)
这使您可以编写:
CallMe(LIFT(Foo));
Run Code Online (Sandbox Code Playgroud)
否则,您想要做什么。