首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据类中的编译时常量创建类型别名?

如何根据类中的编译时常量创建类型别名?
EN

Stack Overflow用户
提问于 2019-03-29 12:19:51
回答 1查看 57关注 0票数 2

我想写一个利用数值求积的类。正交顺序定义了我将要使用的某些容器的大小。我想为这样的集装箱做一个类型的别名,它必须取决于正交顺序。

下面的代码显示了我的尝试。在某种意义上,我必须在别名定义中重复顺序,这感觉不太理想:

代码语言:javascript
代码运行次数:0
运行
复制
#include <array>

class Quadrature
{
public:

        static constexpr unsigned int getOrder()
        {
                return 3;
        }

        // This line doesn't compile!
        //
        // using WeightsContainer = std::array<double, getOrder()>;
        //
        // g++ says "error: 'static constexpr unsigned int Quadrature::getOrder()'
        // called in a constant expression before its definition is complete"

        // This line compiles, but repeats the order. :-(
        using WeightsContainer = std::array<double, 3>;

private:

        WeightsContainer container;
};

我发现的一个解决方案是引入模板参数Order。但实际上,我想确定求积的顺序,引入模板参数会使它变。

是否有可能使顺序成为编译时常量在我的类型别名定义中使用它?

编辑:

为了完整起见,我当然可以使用预处理器定义。但这感觉很老套。:-)

编辑2:

好吧,我找到了另一种可能性。我可以在类范围之外添加一个函数,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
constexpr unsigned int order()
{
    return 3;
}

但这感觉是错误的,因为这是类的属性,因此应该在类范围内!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 13:09:51

您可以做的一件事是将值移动到一个成员变量中:

代码语言:javascript
代码运行次数:0
运行
复制
class Quadrature
{
private:
        static constexpr unsigned int _order = 3;
public:
        static constexpr unsigned int getOrder()
        {
                return _order;
        }    
        using WeightsContainer = std::array<double, _order>;

        // ...
};

如果您需要更复杂的计算,而不仅仅是return 3,那么在C++17下可以使用lambda,正如@Quentin所提到的:

代码语言:javascript
代码运行次数:0
运行
复制
class Quadrature
{
public:
        static constexpr auto getOrder = []()
        {
            return ...;
        };
        using WeightsContainer = std::array<double, getOrder()>;

        // ...
};

否则,由于提到的here的原因,您需要将函数拉出类范围之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55417328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档