首页 > 解决方案 > 可变参数模板。可变参数模板数据结构中模板参数列表的大小

问题描述

我有一个tuple样式可变参数模板数据类型。我想获取tuple_size获取模板参数数量的类型函数。但是,我无法让以下工作正常进行。

template<typename... T>
struct A
{
};

template<typename T, typename ...S>
struct A<T, S...>
{
  T t;
  A<S...> s;
};


template<typename T>
size_t size_A()
{
  return 1;
}

template<typename T, typename... S>
size_t size_A()
{
  return 1 + size_A<S...>();
}


int main() {
  A<int,double,uint> a {2,3.5,10};
  constexpr size_t n = size_A<decltype(a)>();
  std::cout << n << std::endl;
}

我收到以下错误:

error: call of overloaded ‘size_A<A<int, double, unsigned int> >()’ is ambiguous
   constexpr size_t n = size_A<decltype(a)>();

note: candidate: ‘size_t size_A() [with T = A<int, double, unsigned int>; size_t = long unsigned int]’
 size_t size_A()
        ^~~~~~

note: candidate: ‘size_t size_A() [with T = A<int, double, unsigned int>; S = {}; size_t = long unsigned int]’
 size_t size_A()
        ^~~~~~

如何区分有参数包和没有参数包?

以下确实有效,但我只想使用该类型而不必找到该类型的实例。实际问题将具有类型,并且可能没有该类型的实例。

template<typename T>
constexpr size_t size(const A<T>& t)
{
  return 1;
}

template<typename T, typename... S>
constexpr size_t size(const A<T,S...>& t)
{
  return 1 + size(t.s);
}

这与给定类型实例的可变模板函数不同。

我该如何进行size_A工作,tuple_size以便仅按类型获取模板参数的数量?

标签: c++variadic-templates

解决方案


推荐阅读