2

因此,对于前面关于带有三元运算符的 const/non-const 的问题,以下test函数是否适用于 C++11 标准:

template<bool UseConst> class MyClass
{
    public:
        constexpr bool test()
        {
             return (UseConst) ? (_constvar) : (_var);
        }

    protected:
        int _var;
        static const int _constvar;
}

整个问题是,它_constvar是 const,并且_var是非常量。我必须通过相同的函数根据模板参数访问这两个数据,并且我希望在使用 const 时有一个编译时函数。

功能是否test()满足我的要求?

4

1 回答 1

0

您可以使用 SFINAE 来“专门化”您的test功能。换句话说,您可以执行以下操作:

template<bool true_false>
struct true_type
{
    static char value;
};

template<>
struct true_type<false>
{
    static char value[2];
};

template<bool UseConst> class MyClass
{
    private:
        constexpr int pre_test(const char arg) { return _constvar; }
        int pre_test(char (&)[2]) const { return _var; }

    public:
        constexpr int test()
        {
             return pre_test(true_type<UseConst>::value);
        }

    protected:
        int _var;
        static const int _constvar;
};

现在,当您调用时MyClass::test,如果UseConstfalsetest将降级为运行时函数,但当UseConst是时true,您将获得编译时函数。

于 2012-09-26T14:27:37.883 回答