我试图根据类模板参数确定调用哪个版本的成员函数.我试过这个:
#include <iostream>
#include <type_traits>
template<typename T>
struct Point
{
void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0)
{
std::cout << "T is int." << std::endl;
}
void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0)
{
std::cout << "T is not int." << std::endl;
}
};
int main()
{
Point<int> intPoint;
intPoint.MyFunction();
Point<float> floatPoint;
floatPoint.MyFunction();
}
Run Code Online (Sandbox Code Playgroud)
我认为这是说"如果T是int,则使用第一个MyFunction,如果T不是int,则使用第二个MyFunction,但我得到编译器错误"错误:'struct std :: enable_if'中没有类型名为'type'谁能指出我在这里做错了什么?
我是新手编写模板元编程代码(而不仅仅是阅读它).所以我正在与一些菜鸟问题发生冲突.其中一个很好地总结了这个名为"我的SFINAE发生了什么?"的非SO帖子.,我将C++ 11-ize如下:
(注意:我在这个"思想实验"示例中给出了方法不同的名称,仅用于帮助我的错误诊断.请参阅@ R.MartinhoFernandes关于为什么在实践中不实际选择这种方法进行非重载的说明.)
#include <type_traits>
using namespace std;
template <typename T>
struct Foo {
typename enable_if<is_pointer<T>::value, void>::type
valid_if_pointer(T) const { }
typename disable_if<is_pointer<T>::value, void>::type
valid_if_not_pointer(T) const { }
};
int main(int argc, char * argv[])
{
int someInt = 1020;
Foo<int*>().valid_if_pointer(&someInt);
Foo<int>().valid_if_not_pointer(304);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
@Alf说SFINAE发生的事情是"它首先不在那里",并提出了编译的建议,但模拟了函数而不是类.这可能适合某些情况,但不是全部. (例如:我特意尝试编写一个容器,可以容纳可能是也可能不是可复制构造的类型,我需要根据它来打开和关闭方法.)
作为一种解决方法,我给了它一个镜头......看起来工作正常.
#include <type_traits>
using namespace std;
template <typename T>
struct FooPointerBase {
void valid_if_pointer(T) const { }
};
template <typename T>
struct FooNonPointerBase {
void valid_if_not_pointer(T) …Run Code Online (Sandbox Code Playgroud)