c++ - 推导元组的类型

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

我有这样的代码:

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 罪吗?有没有更好的办法?

最佳答案

这里的不完美之处在于我们不能部分特化函数模板。你的方法很好,因为我们没有取消引用空指针;我更喜欢使用指定标签:

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

关于c++ - 推导元组的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36032917/

相关文章:

c++ - "atomic object"的定义

c++ - 在 constexpr 函数体 c++14 中可以有非文字类型的定义变量吗?

c++ - 有什么办法可以避免 valarray 和数组之间的复制?

c++ - 如何在所有派生类中调用重写的方法

c++ - invoke_result_t<> 没有将 lambda 与引用参数匹配

c++ - 编译递归模板调用静态成员函数时类型不完整

C++:从 union 中检索值的模板函数

c++ - 两个不同流上的 operator<<(ostream&, obj) 线程安全吗?

c++ - C++模板特化成员函数的定义

带有 C 接口(interface)的 C++ 库