1

作为一个实验,我正在尝试根据类模板参数创建一个没有参数的 void 成员函数更改行为:

#include <iostream>
#include <limits>

template<typename T>
class MyClass
{
public:
  void MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy = T());
  void MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy = T());

};

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy)
{
}

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy)
{
}

class Simple {};

int main(int argc, char *argv[])
{
  MyClass<int> myClass;
  myClass.MyFunc();

//   MyClass<Simple> myClass2;
//   myClass2.MyFunc();

  return 0;
}

但是,我得到:错误:重载“MyFunc()”的调用不明确。不应该只定义这些函数中的一个或另一个,因为除了 ! 在其中之一?

4

3 回答 3

4

不,首先您需要实际访问 的::typetypedef enable_if,其次,您的代码将不起作用,因为您的成员不是模板。其中一个总是最终成为无效声明。

应用必要的修复后,在您尝试调用成员之前很久::type,您的代码将在实例化时失败。MyClass<int>

使您的成员成为成员模板,并使enable_if依赖于成员模板的参数,而不是依赖于封闭类模板的参数。

于 2012-01-04T23:59:08.777 回答
2

您必须制作虚拟模板参数才能完成我的要求:

#include <iostream>
#include <limits>

template<typename T>
class MyClass
{
public:
  template <typename U = T>
  void MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy = U());
  template <typename U = T>
  void MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy = U());
};

template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy)
{
}

template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy)
{
}

class Simple {};

int main(int argc, char *argv[])
{
  MyClass<int> myClass;
  myClass.MyFunc();

  MyClass<Simple> myClass2;
  myClass2.MyFunc();

  return 0;
}
于 2012-01-05T00:08:10.243 回答
0

说:

std::enable_if<std::is_fundamental<T>::value, T>::type
//                                              ^^^^^^
于 2012-01-04T23:55:33.023 回答