C ++中有什么方法可以在不调用函数模板或不提供其模板参数的情况下引用它?

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)

这可以正常工作,但是我敢肯定,这会使我的图书馆用户感到困惑。我可以使用一些模板魔术来使第一个版本正常工作吗?

Bar*_*rry 5

我可以使用一些模板魔术来使第一个版本正常工作吗?

我希望。我希望有一天。在这方面有一些建议(例如P0119P0834)。在此之前,您最好的办法是编写一个提升宏,以将您的名称转换为调用该名称的函数对象:

#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)

否则,您想要做什么。