gpt4 book ai didi

c++ - 函数参数中的 Typedef 等价

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:38 28 4
gpt4 key购买 nike

如果没有例子,这个问题很难问,所以这里是:

#include <vector>

struct O
{
};

struct C
{
template <typename T>
void function1(void (C::*callback)(const O*));

template <typename T>
void function2(void (C::*callback)(const typename T::value_type));

void print(const O*);
};


int main()
{
C c;

c.function1< std::vector<O*> >(&C::print); // Success.
c.function2< std::vector<O*> >(&C::print); // Fail.
}

我得到的错误是:

error: no matching function for call to ‘C::function2(void (C::*)(const O*))’.

基本上,调用之间的唯一区别是在 function2 中,我更通用,因为我使用了 typedef std::vector<O*>::value_type应该解析为 O* ,因此类似于 function1 .

我使用的是 G++ 4.2.1(我知道它很旧),但 Comeau 确认我错了。

为什么会编译失败?

最佳答案

你的问题是 const typename T::value_type 基本上是 typename T::value_type const 解析为 O* const显然与 const O* 不同(当在类型后面编写 ptr 声明时,它将是 O const *(对于弄清楚这种行为更有用))。

至于归档你想要什么,那完全取决于你想要什么。如果您愿意,可以使用 boost type_traitstr1 type_traits 去除指针,添加 const 并再次使其成为指针,如下所示:

template <typename T>
void function2(void (C::*callback)(typename boost::add_pointer<typename boost::add_const<typename boost::remove_pointer<typename T::value_type>::type>::type>::type));

使用 tr1 而不是 boost 基本上应该是将 boost:: 替换为 std::tr1::.

但是我不认为这是一个有用的概括,所以如果您真的想那样做,您可能需要考虑得更多。就我个人而言,我要么使用类似 boost function 的东西,要么使用自由函数作为回调,前者允许更大的灵 active 来使用回调(自由函数、仿函数、成员函数),而后者在至少可以很容易地创建第二个函数,该函数将适本地转换参数(也就是说,如果您想使用一个以 const O* 作为参数的函数,您可以创建一个以 O * 并使用该参数调用第一个并将其用作回调)。

关于c++ - 函数参数中的 Typedef 等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718737/

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