我收到了一个很大的代码,其中有一个类template <int dim> class point
,它的工作方式类似于vector
。
由于该类(以级联方式(涉及许多其他类、方法等,因此它强制这些其他类等成为具有与类模板非类型参数相同的整数常量表达式的模板。例如,有一个class D
,我想添加它:
void D::coords(const point<dim>&)
void D::verif(const source<dim>&)
这里source
是一个基类(可以是抽象的(,有自己庞大的层次结构,它在其中一个方法中使用point
。在这种情况下,我想我不得不将D
及其派生的类层次结构转换为模板,这意味着在许多点上修改数百个源/头。
如果class point
使用dim
作为类成员而不是模板参数,则此添加会简单得多。我将简单地在D.h
和D.cc
中添加该方法。在我看到的代码的所有部分中,这样的更改都不会提供相同的功能。
在我深入研究这种巨大的修改之前,我想知道。。。
将整型常量表达式用作类模板非类型参数的可能用途是什么,这些参数不能由类成员替换我想应该有一些,我欢迎所有可能的例子。这可能有助于我理解我的选择(也许没有!(
或者(选项B?(,是否有一种方法可以进行预期的添加,不需要我预见的巨大修改,只需要D.h
和D.cc
中的添加
积分常量表达式作为类模板非类型参数的可能用途是什么会员
这样的表达式必须在编译时可求值的任何情况。可以给出许多例子,但具有"变体"大小的std::array
成员的类就是一个:
#include <iostream>
#include <array>
#include <algorithm>
template<size_t n>
class foo {
public:
std::array<int, n> data;
foo() {
std::fill(data.begin(), data.end(), 42);
}
void list()
{
for (auto i : data) std::cout << i << " ";
std::cout << std::endl;
}
};
int main(void)
{
foo<3> f3; f3.list();
foo<7> f7; f7.list();
return 0;
}
即使使用constexpr
限定符,我也不确定如何将foo
实现为非模板类。
事实上,std::array
类模板本身使用了一个非类型参数,该参数是";积分常数表达式;所以这是另一个例子。