我正在尝试创建一个模板,该模板将以一种方式适用于所有基本类型,另一种方式适用于从 A 派生的所有类,而对其他所有类均无效。阅读 SFINAE,我创建了这样的东西:
struct A {};
struct B : A
{
int a;
};
template <typename T, typename = typename std::enable_if<std::is_base_of<A, T>::value>::type>
void foo(const T& derived)
{
std::cout << "stuff with derived";
}
template <typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type>
void foo(const T& pod)
{
std::cout << "stuff with fundamental";
}
int main()
{
foo(7);
B instance;
foo(instance);
}
据我了解,7 (int) 的匹配模板类型在第一种情况下失败,在第二种情况下有效,派生类在第一种情况下有效。我做错了什么?
最佳答案
试试这个:
#include <iostream>
struct A {};
struct B : A
{
int a;
};
template <typename T>
typename std::enable_if<std::is_base_of<A, T>::value, void>::type foo(const T& derived)
{
std::cout << "stuff with derived";
}
template <typename T>
typename std::enable_if<std::is_fundamental<T>::value, void>::type foo(const T& pod)
{
std::cout << "stuff with fundamental";
}
int main()
{
foo(7);
B instance;
foo(instance);
}
enable_if<>的第二个参数是返回类型。
关于c++ - 一种用于 POD 的模板特化,一种用于类层次结构和其他情况下的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104811/