在 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(它声明可以评估变量在编译时的值)变量,不能作为模板参数使用。