1

私はこれを検索しようとしましたが、私が考えるすべての用語は、まったく無関係な結果に終わります.

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

4

2 に答える 2

1

どのコンパイラを使用しますか? コード Visual Studio 2012 および 2013 を試してみましたが、警告やエラーなしでコンパイルされました。いずれにせよ - constness で遊んでいるときは static_cast の代わりに const_cast を試す必要があります

于 2013-11-09T07:16:00.297 に答える