我有一个string类实现为类模板,如下所示:
template <class T>
class HGStringBasic
{
//...
public:
//...
HGStringBasic& operator += (const T* rhs)
{
//...
}
template <class U, std::enable_if_t<std::is_same<U, char>::value>* = nullptr>
HGStringBasic& operator += (const U* rhs)
{
//...
}
//...
}代码是符合C++ 11标准的。目标是实现重载操作符+= (const ),如果模板的类T为"wchar_t“,则只使用该操作符。
我想知道,如果编译器不理解C++11,我如何才能实现相同的结果。
更新:我对stackoverlow很陌生,我还没有看到我的代码在代码块中没有完全显示出来。到目前为止,我已经更新了我的代码。我还更正了模板函数操作符+= ()中模板参数列表中的一个错误,TartanLlama完全正确,is_same<T, char>必须是is_same<U, char>。
发布于 2015-10-21 08:21:19
现在我已经搞清楚了,没有c++11,而且已经有了已知的元功能。非常感谢Barry的提示,并指定了返回类型。
以下是我所做的:
#include <type_traits>
template <class _ElemT>
class HGStringBasic
{
public:
// Append char* or wchar_t* depending on specialization
HGStringBasic& operator += (const _ElemT* rhs)
{
return *this;
}
// Allow char* if specialization is wchar_t
template <class U>
typename std::enable_if<std::is_same<U, char>::value, HGStringBasic&>::type operator += (const U* rhs)
{
// Convert ansistring to widestring
return *this;
}
// Allow wchar_t* if specialization is char
template <class U>
typename std::enable_if<std::is_same<U, wchar_t>::value, HGStringBasic&>::type operator += (const U* rhs)
{
// Convert widestring to ansistring
return *this;
}
};发布于 2015-10-16 14:53:35
enable_if不依赖于C++11功能。它是在boost库中的C++11之前实现的,几乎和现在实现的方式一样。下面是从cppreference.com获取的一个可能的实现
template<bool B, class T = void>
struct enable_if {};
template<class T>
struct enable_if<true, T> { typedef T type; };在C++中,这将在C++11之前非常好地工作。
发布于 2015-10-16 14:55:03
首先,可以很容易地在C++2003中实现启用_if/is_同。例如,Boost有它们,或者您可以自己创建它们--这是一个很好的实践。
第二,如果不想使用enable_if,只需为w_char提供myString的专门化。为了减少编码量,将其放入某个基类中,从基类派生myString并提供基类的专门化。
https://stackoverflow.com/questions/33173334
复制相似问题