13

考虑一个只在运行时包装一个值的类:

template <typename Type>
class NonConstValue 
{
    public:
        NonConstValue(const Type& val) : _value(val) {;}
        Type get() const {return _value;}
        void set(const Type& val) const {_value = val;}
    protected:
        Type _value;
};

以及它的 constexpr 版本:

template <typename Type>
class ConstValue 
{
    public:
        constexpr ConstValue(const Type& val) : _value(val) {;}
        constexpr Type get() const {return _value;}
    protected:
        const Type _value;
};

问题 1:您能否确认 constexpr 版本的设计方式正确?

问题 2:如何将两个类混合成一个Value可以constexpr构造或运行时构造的类,并且其值可以get()在运行时或编译时?

编辑:问题 3:如果get().cpp文件中定义,如果我想get()内联,如果它不是constexpr函数的正确声明是什么?是吗

constexpr inline Type get();

或者

inline constexpr Type get()

或者是其他东西 ?

4

2 回答 2

28

只需将说明constexpr符添加到每个潜在的常量表达式函数。

template <typename Type>
class Value 
{
public:
    constexpr Value(Type const& val) : _value(val) {}
    constexpr Type const& get() const {return _value;}
    void set(Type const& val) {_value = val;}
protected:
    Type _value;
};

您不需要const非常量版本,因为这可以通过Value使用const非常量类型实例化模板来完成。

您不需要constexpr非 constexpr版本,constexpr这意味着潜在的常量表达式以及表达式是否最终成为常量表达式取决于它的参数。表达式是否最终在编译时被评估取决于上下文和实现。

于 2013-01-18T00:59:56.487 回答
2

您的constexpr类设计正确,只是您输入了构造函数的名称错误(应该是ConstValue,而不是Value)。但我确信这只是一个错字。

您的版本的实例constexpr既可以用作编译时对象,也可以用作运行时对象。

template <typename Type>
class ConstValue
{
    public:
        constexpr ConstValue(const Type& val) : _value(val) {;}
        constexpr Type get() const {return _value;}
    protected:
        const Type _value;
};

int main(int argc, char* argv[])
{
    int x[ConstValue<int>(3).get()];
}
于 2013-01-18T01:00:42.393 回答