Специализация только одного метода шаблона класса - PullRequest
0 голосов
/ 27 мая 2020

У меня есть шаблон класса, который правильно работает для всех возможных типов T1, T2.

template <typename T1, typename T2>
class Basic {
    int a;
    float b;

public:
    void foo(T1 t1, T2 t2) {
        // use a, b, t1, t2
    }
};

Однако есть один случай, когда T2 равно char, и я ожидаю, что foo будет вести себя по-разному. Basic, которые не обязательно связаны с функцией foo.

При этом, я чувствую, что полная специализация класса была бы лишней. Есть ли лучшее решение?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы можете перейти с помощью std::is_same<T2, char>, например if (std::is_same<T2, char>::value), или вы можете использовать отправку тегов, например:

public:
    void foo(T1 t1, T2 t2) {
        foo_impl(t1, t2, std::is_same<T2, char>{});
    }

private:
    void foo_impl(T1 t1, T2 t2, std::false_type) {
        std::cout << "T2 != char\n";
    }

    void foo_impl(T1 t1, T2 t2, std::true_type) {
        std::cout << "T2 == char\n";
    }

Demo

1 голос
/ 27 мая 2020

Вы можете использовать std::is_same, чтобы делать что-то еще в foo, когда T2 равно char:

void foo(T1 t1, T2 t2) {
   if (std::is_same<T2, char>::value)
     std::cout << "char";
   else
     std::cout << "not char";
}

Вам не нужна полная специализация of Basic для этого или даже специализацию для foo.

Вот demo .

Из c ++ 17 вы даже можете избежать компиляции ветвь, которая не нужна (т. е. скомпилируйте ветвь char, только когда T2 равно char, и наоборот), используя if constexpr, например:

if constexpr (std::is_same<T2, char>())

Вот демонстрация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...