Можно ли избавиться от специализации шаблона с помощью std :: enable_if? - PullRequest
0 голосов
/ 05 февраля 2019

Я прочитал о std::enable_if для:

Перегрузка функции на основе произвольных свойств типа

Поэтому я пытался перегрузить ctors класса через enable_if (как показано ниже), но я получаю сообщение о том, что enable_if нельзя использовать для отключения объявления, и это в обеих строках, когда я использовал std::enable_if:

#include <iostream>
#include <type_traits>
#include <typeinfo>


template <typename T>
class cls
{
public:

    cls (T a, typename std::enable_if< std::is_same<T, int>::value >::type  * Dummy = 0)
    {
        std::cout << "Ctor for int\n";
    }

    cls (T a, typename std::enable_if< std::is_same<T, char>::value >::type  * Dummy = 0)
    {
        std::cout << "Ctor for char\n";
    }
};

int main()
{

    cls a(10);
    cls b('x');

    return 0;
}

Так что возможно перегрузить ctors, используя enbale_if.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Проблема, например, когда вы создаете экземпляр cls<int>, вы всегда получите невыполненное требование из-за наложения второго конструктора, то есть std::enable_if< std::is_same<T, char>::value >::type с T равно int.И то же самое для cls<char>.

. Вы можете создавать шаблоны конструкторов, чтобы SFINAE вступил в силу;который избавит от специализаций шаблона из набора перегрузки и не вызовет ошибку компиляции.например,

template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, int>::value >::type  * Dummy = 0)
{
    std::cout << "Ctor for int\n";
}

template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, char>::value >::type  * Dummy = 0)
{
    std::cout << "Ctor for char\n";
}

LIVE

0 голосов
/ 05 февраля 2019

Вам, кажется, не нужен enable_if здесь, просто обычный конструктор:

cls(T a) { std::cout << "Ctor for T\n"; }

Чтобы отключить специализацию класса шаблона, не предоставьте его определение:

template<> class cls<void>; // disabled specialization.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...