标签调度/ enable_if - 我很困惑

时间:2015-06-21 17:23:11

标签: c++ c++14 traits template-meta-programming

我有以下结构:

struct A
{
}

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

我想创建一个模板函数,它将重载&lt;&lt;每个类的运算符都有一个名为children的成员变量。 如果可能 - 仅限于名为children的元组。

当满足像B这样的子元组的类时,它应该迭代元组成员并调用&lt;&lt;他们每个人。

类似的东西:

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;
    }  

我已经尝试了很多例子 - 但是我无法在Visual Studio 2015中获得任何工作。

1 个答案:

答案 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;
}