gpt4 book ai didi

c++ - 如何从 C++ 模板中的方法类型推断类类型?

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

在如下所示的模板中,我想调用 Run(&Base::foo)无需两次命名 Base 类型即可成功(正如在编译 Run<Base>(&Base::foo) 调用中所做的那样)。我可以要那个吗?可能不添加大量 Boost标题?

使用提供的代码,我得到一个错误:

prog.cpp:26: error: no matching function for call to ‘Run(bool (Base::*)())’

(您可以修改 http://ideone.com/8NZkq 中的代码片段):

#include <iostream>

class Base {
public:
bool foo() { return true; }
};

Base* x;

template<typename T>
struct Traits {
typedef bool (T::*BoolMethodPtr)();
};

template<typename T>
void Run(typename Traits<T>::BoolMethodPtr check) {
T* y = dynamic_cast<T*>(x);
std::cout << (y->*check)();
}

int main() {
Base y;
x = &y;
Run<Base>(&Base::foo);
Run(&Base::foo); // why error?
}

最佳答案

TTraits<T>::BoolMethodPtr处于非推导上下文中,因此编译器不会从调用中自动推断出 T 应该是什么类型。这是因为可能有这样的代码:

template<typename T>
struct Traits {
typedef bool (T::*BoolMethodPtr)();
};

template<>
struct Traits<int> {
typedef bool (Base::*BoolMethodPtr)();
};

Run(&Base::foo); /* What should T be deduced to? Base and int are both equally possible */

如果你可以不用 Traits<T>类,你可以写Run作为:

template<class Class>
void Run(bool (Class::*check)()) {
Class* y = dynamic_cast<Class*>(x);
std::cout << (y->*check)();
}

在这种情况下,Class可以推导出意思是Base

关于c++ - 如何从 C++ 模板中的方法类型推断类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3830491/

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