2015-06-21 73 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 ] –