在 C++ 模板参数中不使用 constexpr
Not using constexpr in c++ template arguments
我正在使用 itk::Image<OutputPixelType, Dimension>
类型的变量,其中 "itk" 来自图像处理库 ITK。
编译以下代码:
constexpr unsigned int Dimension = 3;
using PixelType = float;
using MyImageType = itk::Image<PixelType, Dimension>;
但现在我需要将 "Dimension" 定义为从函数计算得到的东西。
unsigned int Dimension = get_dimension(...);
我的编译器报错:
error: non-type template argument is not a constant expression
using MyImageType = itk::Image<PixelType, Dimension>;
^~~~~~~~~
我该如何解决这个问题?我希望使用 "Dimension" 作为从函数计算的东西。
您的 get_dimension
函数应该是 constexpr
,如果是这样,您可以使用以下函数:
constexpr unsigned int Dimension = get_dimension(...);
例子
假设您有以下简化的 class:
template <int v>
class Foo {
public:
constexpr Foo()
: v_(v)
{}
private:
int v_;
};
然后是:
int v = get();
using FooInt = Foo<v>;
其中get
函数定义如下:
int get() {
return 1;
}
您将得到与示例中相同的错误。
因此,解决方案 将标记 get
函数 constexpr
并使 v
值也 constexpr
像:
constexpr int get() {
return 1;
}
constexpr int v = get();
using FooInt = Foo<v>;
看看demo
更新
为了能够使用模板,编译器需要在编译时知道模板参数,因此,如果 Dimension
不是 constexpr
(它声明可以评估变量在编译时的值)变量,不能作为模板参数使用。
我正在使用 itk::Image<OutputPixelType, Dimension>
类型的变量,其中 "itk" 来自图像处理库 ITK。
编译以下代码:
constexpr unsigned int Dimension = 3;
using PixelType = float;
using MyImageType = itk::Image<PixelType, Dimension>;
但现在我需要将 "Dimension" 定义为从函数计算得到的东西。
unsigned int Dimension = get_dimension(...);
我的编译器报错:
error: non-type template argument is not a constant expression
using MyImageType = itk::Image<PixelType, Dimension>;
^~~~~~~~~
我该如何解决这个问题?我希望使用 "Dimension" 作为从函数计算的东西。
您的 get_dimension
函数应该是 constexpr
,如果是这样,您可以使用以下函数:
constexpr unsigned int Dimension = get_dimension(...);
例子
假设您有以下简化的 class:
template <int v>
class Foo {
public:
constexpr Foo()
: v_(v)
{}
private:
int v_;
};
然后是:
int v = get();
using FooInt = Foo<v>;
其中get
函数定义如下:
int get() {
return 1;
}
您将得到与示例中相同的错误。
因此,解决方案 将标记 get
函数 constexpr
并使 v
值也 constexpr
像:
constexpr int get() {
return 1;
}
constexpr int v = get();
using FooInt = Foo<v>;
看看demo
更新
为了能够使用模板,编译器需要在编译时知道模板参数,因此,如果 Dimension
不是 constexpr
(它声明可以评估变量在编译时的值)变量,不能作为模板参数使用。