2015-06-21 75 views
0

我有以下結構:tag分派/ enable_if - 我很困惑

struct A 
{ 
} 

struct B 
{ 
tuple<string,string> children{{"test1","test2"}}; 
} 

我想創建一個模板功能,將超載< <操作上有所謂的兒童成員變量的每個類。 如果可能的話 - 僅限於名爲子元組的元素。

當滿足像B這樣的子元組的類時,它應該迭代元組成員,並在每個成員上調用< <。

喜歡的東西:

template<typename RECEIVERTYPE,typename SENDERTYPE> 
typename std::enable_if<std::have_children_member<RECEIVER_TYPE>::value, void>::type 
RECEIVERTYPE& operator<< (RECEIVERTYPE& streamReceiver, const SENDERTYPE& streamSender) 
    { 
     for_each(streamSender.children, [&](const auto& child) 
     { 
      streamReceiver << child; 
     }); 

     return streamReceiver; 
    } 

我已經嘗試了很多的examples-但我真的不能得到任何東西在Visual Studio 2015年的工作

+0

是什麼'的std :: have_children_member'? – UmNyobe

+0

這是不存在的 - 它是爲了顯示我的目標。 –

回答

4

我只想做只匹配類型的元組成員所謂children

template<typename S, typename T, 
     std::size_t = std::tuple_size<decltype(T::children)>::value> 
    S& operator<<(S& s, const T& t) 
    { ... } 

而且有可能實現身體是這樣的:

template<typename S, typename T, std::size_t... I> 
    void 
    print_tuple_like(S& s, const T& t, std::index_sequence<I...>) 
    { 
    void* unused[] = { &(s << std::get<I>(t))... };  
    } 

template<typename S, typename T, 
     std::size_t N = std::tuple_size<decltype(T::children)>::value> 
    S& operator<<(S& s, const T& t) 
{ 
    print_tuple_like(s, t.children, std::make_index_sequence<N>{}); 
    return s; 
} 

或者像:

template<std::size_t N, typename S, typename T> 
    void 
    print_tuple_like(S& s, const T& t, std::false_type) 
    { } 

template<std::size_t N, typename S, typename T> 
    void 
    print_tuple_like(S& s, const T& t, std::true_type) 
    { 
    s << std::get<N>(t); 
    print_tuple_like<N+1>(s, t, std::integral_constant<bool, (N+1 < std::tuple_size<T>::value)>{}); 
    } 

template<typename S, typename T, 
     std::size_t N = std::tuple_size<decltype(T::children)>::value> 
    S& operator<<(S& s, const T& t) 
{ 
    print_tuple_like<0>(s, t.children, std::integral_constant<bool, (N != 0)>{}); 
    return s; 
} 
+0

你的解決方案非常聰明 - 我不知道你可以這樣做。我雖然很難編譯它,但我一定在做錯事,能否提供一個例子?也許使用我的嘗試:http://coliru.stacked-crooked.com/a/64432171e853f3f8 –

+1

@Hansvesselgård你寫'operaor <<'的方式對於'A'和'B'都是錯誤的。他們應該是非會員(可能是朋友)的職能。 http://coliru.stacked-crooked.com/a/9819019c6591d89a – 0x499602D2

+0

啊,它編譯 - 但只有當我使用鏗鏘。在使用visual studio 2015時,我得到:錯誤C2338:C++標準沒有爲此類型定義tuple_size。 注意:請參閱參考類模板實例化'std :: tuple_size '編譯 注意:請參閱參考函數模板實例化'void print_tuple_like (S&,const T&,std :: integer_sequence <_Ty,0,1>)'正在編譯爲 [ S = std :: ostream, T = std :: tuple , _Ty = size_t ] –