推导非类型模板参数的模板类型

时间:2020-04-24 13:44:35

标签: c++ templates non-type

我有这个片段,可以用clang ++和g ++很好地编译,对我来说似乎还可以:

template <typename T, std::vector<T> & v>
struct A{};

int main () {

  static std::vector<int> v;
  A<typename decltype(v)::value_type, v> a;

  return 0;
}

...但是A<typename decltype(v)::value_type, v> a;看起来很多余。

我一直在尝试修改A的模板声明,以便自动推断decltype(v)::value_type,但到目前为止还没有成功。是否可以在A<v> a;内实现main()

1 个答案:

答案 0 :(得分:1)

在C ++ 17中,您可能具有:

template <auto&> struct A;

template <typename T, std::vector<T> & v>
struct A<v>
{
  // ...
};

int main()
{
    static std::vector<int> v;
    [[maybe_unused]] A<v> a;
}

Demo

在以前的标准中,您需要

template <typename T, T& v> struct A;
template <typename T, std::vector<T>& v>
struct A<std::vector<T>, v>{};

或类似的

MACRO可能有助于避免使用冗长的decltype(v), v

#define AUTO(v) decltype(v), v
int main()
{
    static std::vector<int> v;
    A<AUTO(v)> a;
    static_cast<void>(a); // Avoid warning about unused variable
}