如果我有例如:

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;
};

第一个问题: 有没有更优雅的解决方案? (只是出于好奇+我有一些转换问题等)。

第二个问题: 使用继承来声明两个相等的类的“解决方法”是否是常用的(在一些重要的库等中)?

最佳答案

一种允许 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;
}

关于c++ - 是否可以使模板特化等于另一种类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53540037/

10-12 05:39