c++ - 推导非类型模板参数的模板类型

标签 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()吗?

最佳答案

在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
}

关于c++ - 推导非类型模板参数的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61409841/

相关文章:

c++ - 创建和发送崩溃报告

C++ 不允许堆栈实例但允许新的删除

c++ - 可变类中的模板函数

c++ - lambda 可以用作非类型模板参数吗?

c++ - 编译器编译一个 'io_service_' 变量显示为 : cannot appear in a constant-expression

php - 什么语言适合写网络爬虫?

c++ - 有没有办法在 Qt 中一次设置多个图标的图标大小(即小部件中的所有图标)?

c++ - 为什么 gcc 和 clang 会为成员函数模板参数生成非常不同的代码?

c++标准实践: virtual interface classes vs.模板

c++ - 源文件中的非类型模板参数显式实例化