首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取决于模板参数是否为元组的条件using语句

取决于模板参数是否为元组的条件using语句
EN

Stack Overflow用户
提问于 2021-04-14 07:31:37
回答 1查看 60关注 0票数 0

在有两个模板参数T和U的模板类中,我想定义一个别名,如果U本身不是元组(T永远不是元组),则别名是元组{T,U};如果U是元组{U0,...,Un},则定义别名是元组{T,U0,...,Un}。我尝试了以下不能编译的代码(对于非元组U):

代码语言:javascript
复制
#include <type_traits>
#include <tuple>

//!
//! Template to check whether a type is a tuple.
//! From : https://stackoverflow.com/questions/13101061/detect-if-a-type-is-a-stdtuple
//!
template <typename T>
constexpr bool IsTuple = false;
template<typename ... types>
constexpr bool IsTuple<std::tuple<types...>> = true;

template<typename T, typename U>
class A
{
using TU = typename std::conditional<IsTuple<U>, decltype(std::tuple_cat(std::declval<std::tuple<T>>(), std::declval<U>())), std::tuple<T,U>>::type;

TU myTuple;

public:
 A() = default;
};

int main()
{
A<int,int> a; //  Fails compiling
              //  Would compile with A<int,std::tuple<int>>
} 

这会导致编译失败,因为std::conditional中的两个类型都必须存在,而tuple_cat无法处理(std::tuple<int>, int>)

有什么简单的方法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 07:51:26

也许是这样的:

代码语言:javascript
复制
template<typename T, typename U>
class A {

  template <typename X, typename Y>
  static std::tuple<X, Y> Helper(Y&&);

  template <typename X, typename ... Elems>
  static std::tuple<X, Elems...> Helper(std::tuple<Elems...>&&);


  using TU = decltype(Helper<T>(std::declval<U>()));
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67083623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档