gpt4 book ai didi

c++ - 如何专门针对特定类型的模板类方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:54 24 4
gpt4 key购买 nike

我有这样的代码:

class Bar {
public:
void print() {
std::cout << "bar\n";
}
};

template<typename T>
class Foo {
public:
template <typename std::enable_if<std::is_base_of<T,Bar>::value,T>::type>
void print() {
t.print();
}

template <typename>
void print() {
std::cout << t << std::endl;
}
private:
T t;
};

int main() {
// Foo<int> foo1;
Foo<Bar> foo2;
foo2.print();
}

这段代码的目的是:如果T tBarBar 的子类, 然后 foo.print()推导为 void print() {t.print();} , 否则推导为 void print() {std::cout << t << std::endl;} ,但事情并没有像我预期的那样工作。编译器错误:

"a non-type template parameter cannot have type 'typename std::enable_if::value, Bar>::type' (aka 'Bar')",

这段代码有什么问题?

最佳答案

  1. 你应该同时重载 print()函数模板(使 SFINAE 工作),否则始终首选非模板函数。

  2. 你应该让print()采用自己的模板类型参数;不应对类模板参数执行类型检查 T直接地,函数模板重载决议和SFINAE是在函数模板本身上执行的,类模板不参与。

  3. 您可以移动 std::enable_if 的部分到返回类型。

  4. 您应该将指定的顺序更改为 std::is_base_of (即 std::is_base_of<Bar, X> ,而不是 std::is_base_of<X, Bar> )如果您希望类型为 BarBar 的派生类.

例如

template <typename X = T>
typename std::enable_if<std::is_base_of<Bar, X>::value>::type print() {
t.print();
}

template <typename X = T>
typename std::enable_if<!std::is_base_of<Bar, X>::value>::type print() {
std::cout << t << std::endl;
}

LIVE

关于c++ - 如何专门针对特定类型的模板类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105053/

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