检查变量是否为常量限定

时间:2015-09-29 20:16:47

标签: c++ c++11 constants

我正在阅读有关const_cast的内容,它看起来不安全且不太有帮助。在SO中关于它的best answer说明它在这样的场景中会有用:

void func(const char* param, bool modify){
    if(modify)
        //const_cast and change param
    // stuff that do not change param
}

尽管这是一种可能的用法,但它有风险,因为你必须正确地提供" modify"的值,否则你会得到一个未定义的行为,因为你正在改变应该是常量的东西。我想知道你是否可以在不提供额外参数的情况下实现相同的功能,为此你很可能需要检查是否存在const限定符。

我发现关闭的东西是std函数is_const,但它似乎仅限于另一种用法:

is_const<const int>::value //returns true
is_const<int>::value // returns false
const int myVar=1;
is_const<myVar>::value // what it would look like ( does not compile)

我也试过使用类似的功能签名,这些功能签名只有&#34; const&#34;限定词,但这被视为重新定义。所以可以做到这一点吗?如果是这样,怎么办呢?

2 个答案:

答案 0 :(得分:8)

您可以使用std::is_const<decltype(myVar)>::value检查myVar是否已声明为const

但是,如果myVar是指针或对另一个对象的引用,则无法从函数内部知道该对象是否为const

答案 1 :(得分:0)

对于这种情况,我认为您可以使用函数的两个重载:

#include <stdio.h>

void func(const char* param) {
    printf("Not modifying %c\n", param[0]);
}

void func(char* param) {
    printf("Modifying %c\n", param[0]);
    func(const_cast<const char*>(param));
}

int main() {
    const char foo[1] = {'F'};
    char bar[1] = {'B'};

    func(foo);
    func(bar);
}

哪个输出:

Not modifying F
Modifying B
Not modifying B

调用func时,将根据参数的常数自动选择右重载。在这里,我让非const版本调用const版本来完成工作,这似乎很适合原始用例,但是您当然也可以让这两个都调用第三个(可能是私有/静态) )版本,该版本采用bool modify参数作为原始建议,但现在知道了常数是正确的。)

或者,如果要使用std::is_const,则可以使用模板函数自动生成const和非const的版本,并自动扣除Modify参数:

#include <stdio.h>
#include <type_traits>

static void func(char* param, bool modify) {
    if (modify)
        printf("Modifying %c\n", param[0]);
    printf("Not modifying %c\n", param[0]);
}

template<typename T>
void func(T *param) {
    func(const_cast<char*>(param), !std::is_const<T>::value);
}

使用与第一个示例相同的main(),这将产生与第一个示例完全相同的输出。