我正在阅读有关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;限定词,但这被视为重新定义。所以可以做到这一点吗?如果是这样,怎么办呢?
答案 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()
,这将产生与第一个示例完全相同的输出。