【发布时间】:2013-08-07 09:56:26
【问题描述】:
基本上我希望我的范围类型可以从Range<const char> 隐式转换为Range<const unsigned char>。 std::enable_if 似乎是不可能的,因为该函数没有参数并且没有返回。有什么解决办法?
这基本上是我尝试过的:
template<typename T>
class Range{
T* begin_;
T* end_;
public:
Range(T* begin,T* end):begin_{begin},end_{end}{}
template<int N>
Range(T (&a)[N]):begin_{static_cast<T*>(&a[0])},end_{static_cast<T*>(&a[N-1])}{}
T* Begin(){return begin_;}
T* End(){return end_;}
operator typename std::enable_if<std::is_same<T,const char>::value,Range<const unsigned char>&>::Type (){
return *reinterpret_cast<Range<const unsigned char>*>(this);
}
};
【问题讨论】:
-
为什么不用
std::is_same<>而不是Loki::IsSameType<>?? -
我在 ARM 皮质上编程裸机,起初让 Loki 工作更容易,所以很好,我改变了它;)
-
您真的需要转换运算符吗?或者你可以和
operator=和构造函数一起生活吗? -
std::enable_if有一个成员类型(def)type(小t),而不是Type。 -
您可以使用
std::conditional在Range<const unsigned char>和void之间切换转换运算符(根据clang++,void的转换运算符是合法的且从未使用过)。或者你可以使用类模板的特化。
标签: c++ metaprogramming sfinae enable-if