【问题标题】:deducing a tuple's types推断元组的类型
【发布时间】:2016-03-16 10:26:01
【问题描述】:

我有这样的代码:

template <typename T>
inline typename ::std::enable_if<
  is_std_tuple<T>{},
  T
>::type
get()
{
  // pull tuple's elements from somewhere
}

为了推断元组被实例化的模板类型参数,我做了这个转换:

static_cast<T*>(nullptr)

并将其作为参数传递给函数

template <typename ...A>
void deduce_tuple(::std::tuple<A...>* const);

我犯了 UB 吗?有没有更好的办法?

【问题讨论】:

  • 将空指针转换为类型并没有错,只要您不取消引用它。你到底想做什么?
  • 我只需要函数中的A...参数包,不知道如何获取它,除了索引技巧和::std::tuple_element&lt;&gt;
  • 坚持使用tuple_sizetuple_element 的一个好处是您的代码也可以免费使用std::pairstd::array

标签: c++ templates language-lawyer c++14 template-argument-deduction


【解决方案1】:

这里的缺陷是我们不能部分专门化函数模板。你的方法很好,因为我们没有取消引用空指针;我更喜欢使用指定的标签:

template <typename...> struct deduction_tag {};

template <typename... Ts>
std::tuple<Ts...> get(deduction_tag<std::tuple<Ts...>>) {
    // […]
}
template <typename T>
std::enable_if_t<is_std_tuple<T>{}, T> get() {
    return get(deduction_tag<T>{});
}

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多