2012-09-26 45 views
2

因此至约常量/非const与三元运算前一个问题,是以下test函数确定关于到C++ 11标准:内用constexpr非const变量?

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

    protected: 
     int _var; 
     static const int _constvar; 
} 

整个问题是,_constvar是常量,并且_var是非常量。我会通过同样的功能来访问这些数据2取决于模板参数,我想有一个编译时功能,当我使用常量。

执行test()功能满足我的要求吗?

+0

为什么就不能专注于'UseConst'从那里走? – Xeo

+0

专营什么?类或函数?对于这个类,我有一大组函数,并且通过像这里这样的单个函数来获取const或non-const会更加简单和简洁。为了专门化这个功能,我没有看到怎么做...... – Vincent

+0

@Vincent:类模板里面的非模板成员函数实际上只是函数模板,并且可以专门化,而不需要专门化整个类。见例如在[这个答案]中的代码(http://stackoverflow.com/a/12598245/636019)。 – ildjarn

回答

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会降低到一个运行时功能,但是当UseConsttrue,你会得到一个编译时函数。