是否可以使模板特化等于另一种类型
Is it possible to make a template specialization to be equal to another type
如果我有例如:
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;
};
第一个问题:有没有更优雅的方案? (只是出于好奇 + 我有一些转换问题等)。
第二个问题:"workaround"是否使用继承来声明两个类相等常用(在一些重要的库等中)?
一种允许 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;
}
如果我有例如:
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;
};
第一个问题:有没有更优雅的方案? (只是出于好奇 + 我有一些转换问题等)。
第二个问题:"workaround"是否使用继承来声明两个类相等常用(在一些重要的库等中)?
一种允许 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;
}