簡體   English   中英

具有enable_if的模板類的模板運算符朋友

[英]Template operator friend of template class with enable_if

我將如何與enable_if成為模板類的朋友來創建模板運算符?

這是我的問題的一個例子:

#include <type_traits>

template<typename CHAR_TYPE>
class BasicString;

template<typename CHAR_TYPE, typename OTHER_CHAR_TYPE,
    typename std::enable_if<((sizeof(CHAR_TYPE)==sizeof(OTHER_CHAR_TYPE))
        && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type = nullptr>
BasicString<CHAR_TYPE> operator+(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);

template<typename CHAR_TYPE, typename OTHER_CHAR_TYPE,
    typename std::enable_if<((sizeof(CHAR_TYPE)!=sizeof(OTHER_CHAR_TYPE))
        && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type = nullptr>
BasicString<CHAR_TYPE> operator+(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);

template<typename CHAR_TYPE>
class BasicString
{
private:
    CHAR_TYPE* characters;
    size_t length;

    template<typename OTHER_CHAR_TYPE,
        typename std::enable_if<((sizeof(CHAR_TYPE)==sizeof(OTHER_CHAR_TYPE))
            && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
    friend BasicString<CHAR_TYPE> operator+<CHAR_TYPE, OTHER_CHAR_TYPE>(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);
    template<typename OTHER_CHAR_TYPE,
        typename std::enable_if<((sizeof(CHAR_TYPE)!=sizeof(OTHER_CHAR_TYPE))
            && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
    friend BasicString<CHAR_TYPE> operator+<CHAR_TYPE, OTHER_CHAR_TYPE>(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);

public:
    BasicString()
        : length(0),
        characters((CHAR_TYPE*)std::malloc(sizeof(CHAR_TYPE)))
    {
        characters[0] = 0;
    }

    BasicString(const BasicString& str)
        : length(str.length),
        characters((CHAR_TYPE*)std::malloc(sizeof(CHAR_TYPE)*(str.length+1)))
    {
        for(size_t i=0; i<length; i++)
        {
            characters[i] = str.characters[i];
        }
    }

    ~BasicString()
    {
        delete characters;
    }
};

template<typename CHAR_TYPE, typename OTHER_CHAR_TYPE,
    typename std::enable_if<((sizeof(CHAR_TYPE)==sizeof(OTHER_CHAR_TYPE))
        && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
BasicString<CHAR_TYPE> operator+(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right)
{
    BasicString<CHAR_TYPE> newStr;
    CHAR_TYPE* characters = newStr.characters;
    //do some stuff. irrelevant to question
}

template<typename CHAR_TYPE, typename OTHER_CHAR_TYPE,
    typename std::enable_if<((sizeof(CHAR_TYPE)!=sizeof(OTHER_CHAR_TYPE))
        && std::is_integral<CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
BasicString<CHAR_TYPE> operator+(const BasicString<CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right)
{
    BasicString<CHAR_TYPE> newStr;
    CHAR_TYPE* characters = newStr.characters;
    //do some stuff. irrelevant to question
}

int main()
{
    BasicString<char> str1;
    BasicString<wchar_t> str2;
    BasicString<char> newStr = str1 + str2;
    return 0;
}

我知道我可以使用輔助函數或輔助類,但我寧願避免使用它。

當我對此進行編譯時,我得到一個錯誤,即運算符無法訪問該類的私有成員,這意味着我的友善代碼無法正常工作。 我將如何結交這些功能?

因此,發布此問題后不久,我就找到了答案。

聲明朋友時,我需要使用另一個模板參數來表示CHAR_TYPE

template<typename _CHAR_TYPE=CHAR_TYPE, typename OTHER_CHAR_TYPE,
        typename std::enable_if<((sizeof(_CHAR_TYPE)==sizeof(OTHER_CHAR_TYPE))
            && std::is_integral<_CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
friend BasicString<_CHAR_TYPE> operator+<_CHAR_TYPE, OTHER_CHAR_TYPE>(const BasicString<_CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);

    template<typename _CHAR_TYPE=CHAR_TYPE, typename OTHER_CHAR_TYPE,
        typename std::enable_if<((sizeof(_CHAR_TYPE)!=sizeof(OTHER_CHAR_TYPE))
            && std::is_integral<_CHAR_TYPE>::value && std::is_integral<OTHER_CHAR_TYPE>::value), std::nullptr_t>::type>
friend BasicString<_CHAR_TYPE> operator+<_CHAR_TYPE, OTHER_CHAR_TYPE>(const BasicString<_CHAR_TYPE>& left, const BasicString<OTHER_CHAR_TYPE>& right);

編輯:在符合標准的編譯器(而不是Visual C ++)中進行測試之后,我發現該標准實際上不允許這樣做,而且似乎沒有任何方法可以實際實現。 我已經承認並參加了一個幫助班,並且對此結了婚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM