gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:48:47 24 4
gpt4 key购买 nike

这是我想要使用的代码:

template <class T> void Foo(T&& param);

template <class F> void CallMe(F&& func)
{
func(42);
}

int main()
{
CallMe(Foo);
}

编译器在尝试实例化 CallMe 时卡住因为它不知道我所说的 Foo 是什么意思.如果我写 Foo<int> 就可以了当然可以,但我想避免这种情况,因为在实际代码中,模板参数可能很复杂。

我目前的解决方法是使用可调用对象而不是自由函数。例如:

class Foo
{
public:
template <class T> void operator()(T&&);
};

这很好用,但我确信它会让我的图书馆的用户感到困惑。是否有一些模板魔术可以让我使用第一个版本?

最佳答案

Is there some template magic I can use to make the first version work?

我愿意。我希望有一天。在这个领域有几个提案(例如 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)...); }

这让你可以写:

CallMe(LIFT(Foo));

否则它会做你想做的事。

关于c++ - C++ 中有没有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com