如果我有例如:
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/