Функция enable_if определена, когда она не должна быть - PullRequest
1 голос
/ 05 января 2012

В качестве эксперимента я пытаюсь сделать функцию-член 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;
}

Однако я получаю: error: вызов перегруженного MyFunc() 'неоднозначно.Не должна быть определена только одна или другая из этих функций, поскольку все одинаково за исключением a!в одном из них?

Ответы [ 3 ]

4 голосов
/ 05 января 2012

Нет, во-первых, вам нужно получить доступ к ::type typedef, равному enable_if, а во-вторых, ваш код не будет работать, потому что ваши участники не являются шаблонами.Один из них всегда будет недействительным объявлением.

После применения необходимого исправления ::type ваш код не будет работать при создании экземпляра MyClass<int> задолго до того, как вы попытаетесь вызвать участника.

Создайте свои элементы-члены и установите enable_if в зависимости от параметра шаблона-члена, а не от параметра шаблона класса-оболочки.

2 голосов
/ 05 января 2012

Вы должны сделать фиктивные параметры шаблона, чтобы сделать то, что я просил:

#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;
}
0 голосов
/ 05 января 2012

Скажи:

std::enable_if<std::is_fundamental<T>::value, T>::type
//                                              ^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...