模板类包装任意类型/非类型模板类

2024-05-22

假设我有一个模板类base和一个班级wrapper其中包含一个实例化成员base。我想定义班级wrapper这样它依赖于模板参数包,该参数包只是“传递”给实例化成员base.

例如,考虑下面的代码,它工作得很好。

#include <iostream>

template <int i, int j>
struct base {
  base()
  {
    std::cout << "i is " << i;
    std::cout << " j is " << j << std::endl;
  }
};

template <int... T>
struct wrapper {
  base<T...> a;
};

int main()
{
  wrapper<2, 3> x;
  return 0;
}

提前知道所有模板参数base are int, I use template <int...T>在声明中wrapper。这允许有限的灵活性,例如我可以为模板参数定义一些默认值base,不修改wrapper.

然而,如果base取决于类型和非类型模板参数的任意列表,我如何传递模板参数wrapper to base?

例如,如果我知道的所有模板参数base可以隐式转换为 int (没有损失!),我可以定义wrapper如下面的程序所示

#include <iostream>

template <int i, bool j>
struct base {
  base()
  {
    std::cout << "i is " << i;
    std::cout << " j is " << (j ? "true" : "false") << std::endl;
  }
};

template <int... T>
struct wrapper {
  base<T...> a;
};

int main()
{
  wrapper<2, true> x;
  return 0;
}

But if base同时取决于类型和非类型模板参数,如下面的程序所示,显然不可能简单地传递模板参数wrapper to base:

#include <iostream>

template <class U, int i, int j>
struct base {
  base()
  {
    std::cout << "i is " << i;
    std::cout << " j is " << j << std::endl;
  }
};

template <class... T>
struct wrapper {
  base<T...> a;
};

int main()
{
  wrapper<int, 2, 3> x; // Error!
  return 0;
}

该程序无法编译,因为编译器需要以下类型wrapper.

有没有办法写一个类wrapper将其模板参数“传递”给类型的成员base, 不管他们是什么?

这个想法是有一个通用代码wrapper如果,例如,模板签名base变化。


您的问题有一个解决方案。它不是很优雅,需要特定的方法,但适用于您想要的情况:

template <class U, class i, class j>
struct base {
  base()
  {
    std::cout << "i is " << i::value;
    std::cout << " j is " << j::value << std::endl;
  }
};

template <class ...T>
struct wrapper {
  base<T...> a;
};

int main()
{
  wrapper<int, std::integral_constant<int, 2>, std::integral_constant<int, 3>> x; //no error now!
  return 0;
}

使用 C++17 可以更简洁:

template<auto val>
using value_wrapper = std::integral_constant<decltype(val), val>;

int main()
{
  wrapper<int, value_wrapper<2>, value_wrapper<3>> x; //no error now!
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板类包装任意类型/非类型模板类 的相关文章

随机推荐