首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有+=元函数的模板类中的重载操作符std::enable_if

带有+=元函数的模板类中的重载操作符std::enable_if
EN

Stack Overflow用户
提问于 2015-10-16 14:45:43
回答 4查看 1.4K关注 0票数 2

我有一个string类实现为类模板,如下所示:

代码语言:javascript
复制
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>

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-21 08:21:19

现在我已经搞清楚了,没有c++11,而且已经有了已知的元功能。非常感谢Barry的提示,并指定了返回类型。

以下是我所做的:

代码语言:javascript
复制
#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;
        }
};
票数 1
EN

Stack Overflow用户

发布于 2015-10-16 14:53:35

enable_if不依赖于C++11功能。它是在boost库中的C++11之前实现的,几乎和现在实现的方式一样。下面是从cppreference.com获取的一个可能的实现

代码语言:javascript
复制
template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

在C++中,这将在C++11之前非常好地工作。

票数 1
EN

Stack Overflow用户

发布于 2015-10-16 14:55:03

首先,可以很容易地在C++2003中实现启用_if/is_同。例如,Boost有它们,或者您可以自己创建它们--这是一个很好的实践。

第二,如果不想使用enable_if,只需为w_char提供myString的专门化。为了减少编码量,将其放入某个基类中,从基类派生myString并提供基类的专门化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33173334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档