我试过搜索这个,但我想到的每个术语最终都会得到完全不相关的结果。
我有一个将指向成员的指针作为参数的函数(模板),但我似乎无法隐式地将指向的成员视为 const。使用 const_cast 有效,但如果可以的话,我想避免显式调用它。
struct MyStruct
{
int *_array;
int _size;
};
template<typename C, typename T>
void DoSomething(T* C::* arr, int siz)
{
// do some read-only stuff with the member here
}
template<typename C, typename T>
void ConstDoSomething(T* C::* arr, int siz)
{
DoSomething<C, T const>(arr, siz);
// DoSomething<C, T const>(const_cast<T const* C::*>(arr), siz); // works
}
MyStruct ms;
ConstDoSomething<MyStruct const, int>(&MyStruct::_array, ms._size); // note: cannot convert ‘arr’ (type ‘int* MyStruct::*’) to type ‘const int* MyStruct::*’
这是一个简化的示例,演示了我在使用更复杂的类树时遇到的问题。我试图避免强制转换,因为调用代码(例如,使用类模板的人)需要它。
更新:当我第一次发布这个时,我不小心使用了一个没有产生相同错误的代码示例。我花了相当多的测试来确定根本原因,即我在模板参数中添加了 const 限定符。上面的示例现在正确地演示了我正在使用的行为。