私はこれを検索しようとしましたが、私が考えるすべての用語は、まったく無関係な結果に終わります.
メンバーへのポインターをパラメーターとして受け取る関数 (テンプレート) がありますが、指しているメンバーを 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 修飾子を追加しているという根本的な原因を特定するには、かなりの量のテストが必要でした。上記のサンプルは、私が使用している動作を適切に示しています。