相关疑难解决方法(0)

使用不同的enable_if条件选择成员函数

我试图根据类模板参数确定调用哪个版本的成员函数.我试过这个:

#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'谁能指出我在这里做错了什么?

c++ templates specialization sfinae c++11

15
推荐指数
2
解决办法
1万
查看次数

"我的SFINAE发生了什么"redux:条件模板类成员?

我是新手编写模板元编程代码(而不仅仅是阅读它).所以我正在与一些菜鸟问题发生冲突.其中一个很好地总结了这个名为"我的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)

c++ sfinae type-traits template-meta-programming c++11

3
推荐指数
2
解决办法
1346
查看次数