Добавление методов к специализации шаблона класса - PullRequest
0 голосов
/ 24 февраля 2019

Я хотел бы добиться поведения, присутствующего в STL: когда мы смотрим на векторный контейнер, известно, что он имеет специализацию vector<bool>, которая добавляет метод flip().

Можно ли достичь такого расширения класса, не копируя весь класс как специализацию и не добавляя новый метод в его тело?

Ответы [ 2 ]

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

Вы можете СФИНАЕ метод «специализации»

template <typename T>
class C
{
public:
    // Common code...

    template <typename U = T, std::enable_if_t<std::is_same<bool, U>::value, bool> = false>
    void only_for_bool() {/*..*/}
};

C ++ 20 позволит лучше синтаксис:

template <typename T>
class C
{
public:
    // Common code...

    void only_for_bool() requires (std::is_same<bool, T>::value) {/*..*/}
};
0 голосов
/ 24 февраля 2019

Полагаю, вы можете написать специализацию, чтобы она наследовала от универсальной версии.

Например: предположим, что у вас есть struct foo с типом и значением (со значением по умолчанию) параметров шаблона;предположим, что у него есть несколько методов (bar(), в следующем примере)

template <typename, bool = true>
struct foo 
 { void bar () {}; };

, и предположим, что вы хотите специализацию для bool (как тип шаблона) с теми же методами и дополнительным baz();вы можете наследовать foo<bool> от общей версии следующим образом

template <>
struct foo<bool> : public foo<bool, false>
 { void baz () {}; };

Вы можете проверить, что

   foo<int>   fi;

   fi.bar();   // compile
   //fi.baz(); // compilation error

   foo<bool>  fb;

   fb.bar();  // compile
   fb.baz();  // compile
...