gpt4 book ai didi

c++ - 将函数作为类模板参数传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:13 27 4
gpt4 key购买 nike

在不知道函数类型的情况下,我使用以下技术声明它的指针并初始化函数指针。

template<typename T>
struct Declare { typedef T Type; }; // for declaring any func ptr

void fun () {}

int main ()
{
Declare<fun>::Type pf = &fun; // can't use C++0x 'auto'
}

但是,它给出了编译错误,错误:需要一个类型,得到了“乐趣”。尽管任何方法的类型在编译时都是已知的。 如上所述将函数传递给类 template 是否无效?

[注意:将 fun 替换为 void (*)() 效果很好。但这不是我们想要的。]

最佳答案

Is it invalid to pass a function into a class template as above ?

完全正确,您混淆了类型参数和非类型参数。
fun 是一个非类型参数,它是一个函数的地址,就像一个任意数0x12345678
typename T 是一个type 参数。您只能传递类型,例如 intMyClassdouble (*)(std::string)void (MyClass::*)().
你将不得不接受这样一个事实,即你需要编译器支持这些东西或一些非常丑陋的技巧来推断类型。
如果您喜欢耍花招,那么 Boost.Typeof 适合像您这样的非 C++0x 编码人员。它还为 auto 提供了 BOOST_AUTO 的替代品,但这只是编写 BOOST_TYPEOF 的一种简短方式:

int hello(){ return 42; }
BOOST_AUTO(var1,hello()); // type of var1 == int
BOOST_TYPEOF(hello()) var2 = hello(); // same

问题是什么?您需要为您拥有的每个用户定义类型提供帮助。参见 this Ideone example


现在,大多数时候我认为您不需要 Boost.Typeof。为什么?因为如果你使用一个函数,你当然需要知道签名,否则你将如何传递正确的参数?或者以正确的方式使用返回类型?
其他时间无论如何都是在模板中使用。如果你声明了一个像 auto fptr = &func 这样的函数指针,那么你就知道 func 存在,也就是你知道它的签名和类型。因为当您不知道 func 存在时,您无论如何都需要将它传递给您,最好是在模板中:

template<class FPtr>
void myfunc(FPtr otherfunc){
// use otherfunc
}

通过模板,您可以再次了解该函数类型。

关于c++ - 将函数作为类模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5691389/

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