2016-03-23 14 views
1

私はいくつかの検索を行ったが、これを見つけることはできませんでした。状況は私の知る限り、100%安全であるテンプレートconst/non-const引数のキャスト

template <class T> class TemplClass; 
void a_function(TemplClass<const X>&); 

TemplClass<X> inst; 
a_function(inst); // fails 

「タイプの表現からタイプの参照の無効な初期化 『TemplClass &』 『TemplClass』」

:このような状況を検討してください。それでも、C++ではこれを許可していません。 Cキャストの代わりにどのようなキャストを使うのだろうか。

a_function(static_cast<TemplClass<const X>&>(inst)); // fails, similar error message 

a_function(reinterpret_cast<TemplClass<const X>&>(inst)); // works 

dynamic_castは問題になりません。const_castも失敗します(正しくはそうです)。

reinterpret_castは怪しいと感じていますか?しかし、私が逃した何らかのトリックの解決策がありますか?標準が単にこれが何か良いものであることを単に検出しないのは誰ですか?それとも、このキャストについて何か「悪い」ものがありますか?

+7

'TemplClass は' TemplClass ''とは関係ありません。彼らは完全に異なるタイプです。 – Simple

+1

'状況は100%安全です'あなたの場合はyesです。一般的にはなし –

+0

Techincally、はい - しかし、意図しない何かをする理由がありますか?仕事しない、クラッシュする、変更してはいけないものを変更する –

答えて

1

TemplClass<const T>TemplClass<T>は無関係なタイプです。

たとえば、あなたは彼らが本当に違う作るために(部分的に)専門を持っていることがあります。他に1を鋳造

template<typename T> 
class TemplClass 
{ 
    void generic(); 
    std::string s; 
}; 

template<typename T> 
class TemplClass<const T> 
{ 
    void foo(); 
    std::vector<int> v; 
}; 

は意味がありません。

同じよう

class A 
{ 
    char* p; 
}; 

class B 
{ 
    char* p; 
}; 

では、これらの2つのクラスは、(それは同じようだとしても)無関係です。

+0

Thx、それです..最初の例は、事態がどこで起こるかを示しています。 2つ目は、C++がクラスについて何を考えているかを示し、私がそれらでできることは示しません。 –

3

しかし、私は逃したトリックのいくつかの種類と解決策はありますか?

理想的な解決策は、制限されたテンプレートインターフェイスを書き込まないことです。たとえば、特定のオブジェクト型を持つ特定のテンプレート型ではなく、範囲を表すイテレータを取る標準ライブラリアルゴリズムを考えてみましょう。

サードパーティのライブラリのようにインターフェイスを修正できない場合は、電話をかける前にTempl<X>Templ<const X>にコピーしていません。

誰もが、標準が単にこれが正常であることを検出しない理由を知っています。 何かいいですか?

それは良いではありませんので。最も単純なケースは、テンプレートの特殊化があり、そこではいくつかの意味/機能が変更されるところです。コンパイラは単にテンプレートのインスタンス化を変更することはできません。

またはこのキャストについて「不良」なものはありますか?言語別

のconstと非constテンプレートのインスタンス化は無関係なタイプであるため、キャストは違法です。実際のケースによっては、おそらく法的な選択肢があります。

+0

を使用できます。ありがとうございます。私は、現代のC++パラダイムのために行くならば、イテレーターがより良い方法であることに同意します。しかし、多くのコードは単に他のパラダイムに基づいており、その中には独自のメリットがあります。 –

+0

実際、私は1つの部分に同意しません: 'X'と 'const X'は異なる種類です。彼らはそうですが、彼らもそうではありません。彼らにはあらゆる種類の相違点がありますが、結局は同じタイプにまで沸きます。私は、あなたが 'const'システムが型システム内の異なる次元であると言うことができると思います。そして、その次元では、常にconst以外のものをconstとして使うことはOKです。 –

+0

だから、私は誰もが彼らが事実上異なるタイプであると言っていることは間違いないと認めます。しかし、私はここでC++がどのように役立つのか見当たりません。結局、私はキャストでき、うまく動作することがわかります。私は反例を見て、そのようなキャストがうまくいかない条件が何かを理解したいと思います。 –

関連する問題