簡體   English   中英

Function 模板作為 class 模板的朋友

[英]Function template as friend of class template

在下面的示例中,我希望 function 模板get()成為 class 模板any_of的友元。 我認為這是顯而易見的,因為any_of應該是一個朋友,所以只有類型參數的get實例化。 索引I不應該是免費的。

template<typename T, typename... TT> struct any_of;

template<auto I, typename... TT> auto& get(const any_of<TT...>&);

template<typename T, typename... TT>
struct any_of {
    template<auto I> friend auto& get<I, T, TT...>(const any_of<T, TT...>&);
    
    any_of(const T& first, const TT&... rest) : mData{first, rest...}{}  
private:
    std::tuple<T, TT...> mData;
};
template<auto I, typename... TT>
auto& get(const any_of<TT...>& a) {
    return std::get<I>(a.mData);
}    
template<typename L, typename... TT>
bool operator==(const L& lhs, const any_of<TT...>& rhs) {
    return [&]<auto... II>(std::index_sequence<II...>){
        return ((lhs == get<II>(rhs)) || ...);
    }(std::make_index_sequence<sizeof...(TT)>{});
}

我想實現所有get<N, char, char>都是any_of<char, char>但不是any_of<int, char>的朋友。

上面的嘗試給出了一個編譯錯誤invalid use of template-id 'get<I, T, TT...>' in declaration of primary template

示例: https://godbolt.org/z/8b69eazPT

一個(函數或類)模板可以是友元,模板的特化(無論是實例化的還是顯式聲明的)可以是友元,但是讓更大的特化子集成為友元的唯一方法是與一個成員成為友元依賴類型:

template<int> struct B;
class A {
  template<int I> friend void B<I>::f();
};

(您甚至不能與已聲明的部分特化成為朋友。)您可以在此處使用該方法,通過定義一個幫助器 class 模板來保存getany_of的實現,但您也可以使整個相應的特化成為朋友,但事實並非如此與添加成員 function 以get呼叫有很大不同。

暫無
暫無

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

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