Можно ли сделать шаблонную специализацию равной другому типу - PullRequest
0 голосов
/ 29 ноября 2018

Если у меня есть, например:

template <class T>
class MyOptional { /*...*/ };

Я знаю, что могу определить специализацию, например, для T = bool, которая будет иметь другую (отдельную) реализацию:

template <> class MyOptional<bool> { /*...*/ };

НоМожно ли сказать, что эта T=bool специализация равна другому типу (например, MyOptBool)?Примерно так:

class MyOptBool { /*...*/ };
using Optional<bool> = MyOptBool;  /* impossible but looking for similar functionality */

Единственное, что я нашел, это использование наследования:

class MyOptBool { /*...*/ };
template <> class MyOptional<bool> : public MyOptBool {
  using MyOptBool::MyOptBool;
};

1-й вопрос: Есть ли более элегантное решение?(просто из любопытства + у меня есть некоторые проблемы с конвертацией и т.и др.)?

1 Ответ

0 голосов
/ 29 ноября 2018

Один из возможных подходов, который позволяет Optional<T> разрешать таким образом, даже если на самом деле он не заканчивается специализацией MyOptional, по сути:

template<class T>
class MyOptional {};

class MyOptBool {};

template<class T>
struct OptionAlias {

    typedef MyOptional<T> type;
};

template<>
struct OptionAlias<bool> {

    typedef MyOptBool type;
};


template<typename T>
using Optional = typename OptionAlias<T>::type;

void foo()
{
    Optional<int> x;

    Optional<bool> y;
    MyOptBool z=y;
}
...