相关疑难解决方法(0)

标准是否要求std :: tuple_size是SFINAE友好的?

编辑追加:问题标题是"做Visual Studio编译器或Clang有不正确的行为" - 但是已经改变了.

所以我在这里补充说clang和gcc按照我的意图编译它,但VS没有.

我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility(313): error C2338: The C++ Standard doesn't define tuple_size for this type.
1>  c:\users\jonas\documents\visual studio 2015\projects\consoleapplication7\consoleapplication7\consoleapplication7.cpp(36): note: see reference to class template instantiation 'std::tuple_size<unknown-type>' …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae c++14

14
推荐指数
2
解决办法
690
查看次数

std :: tuple_cat,但仅包含唯一元素

我需要一个constexpr非常类似于的函数std::tuple_cat,但是与其将所有元素合并为一个元组,而不必将所有元素合并到一个元组中,而是仅在尚未添加该类型的情况下,才需要添加该元素。

将谓词传递进来std::tuple_cat会很好,但是不存在这样的API(令我非常沮丧)。我已经看到了几种使用类型特征来查找合并类型的方法,但我还没有完全理解这些方法,但是没有任何形式的constexpr函数。我不确定如何将所有内容放在一起,尽管我确定可以做到。

像这样:

std::tuple<int, short, char> First;
std::tuple<short, float> Second;
std::tuple<int, double, short> Third;

std::tuple<int, short, char, float, double> Result = tuple_cat_unique(First,Second,Third);
Run Code Online (Sandbox Code Playgroud)

c++ templates tuples template-meta-programming c++17

10
推荐指数
1
解决办法
311
查看次数