2017-10-13 3 views
2

私はC + +の問題に興味深い繰り返しテンプレートパターンを使用しています。 同じメソッドを使用する特定のインスタンスでは、サブクラスまたは基本クラスを返す必要があります。オーバーロードされたメソッドのクラスはテンプレートとベースクラスを受け入れます - どのメソッドをデフォルトにするか?

そのため、私は、このような

template <typename deriv> 
class base { 

void run(deriv& d) {//deriv specific method/derived class/} 
void run(base& b) { //base specific method// } 
} 

などの他の方法を持っていながら、12月には

base& get() { 
return base_ref || deriv_ref; //depends on impl 
} 

ようなものになるだろう方法しかし、私はderived classを返すたび(つまりはbase&としてreinterpertedされる)メソッドのデフォルト以下に示すように、クラス実装のbaseに接続します。

template<typename d> 
struct base { 

    void run(d& type) { 
     std::cout << "deriv " << std::endl; 
    } 
    void run(base& type) { 
     std::cout << "base" << std::endl; 
    } 
    base& alter(d& der) { 
     return der; 
    } 
    d& no_alt(d& der) { 
     return der; 
    } 
}; 
struct deriv : public base<deriv> { 

}; 
int main() { 
    deriv foo; 
    base<deriv> bar; 
    bar.run(foo);   //prints deriv 
    bar.run(bar);   //print base 
    bar.run(bar.alter(foo));//print base (Need this to print deriv) 
    bar.run(bar.no_alt(foo));//print deriv 

} 

これらのインスタンスでは、方法をデフォルトでderived_methodsにすることはできますか?

さらに、コンパイラは、(同じ型を受け入れる2つのメソッドが基本的に)不十分な警告を与えるべきだと思います。

+0

私はあなたの質問を理解しているかどうか分からないが、私は見ることができるから、出力にエラーはない –

+0

ちょっと、上記の方法は値ではなく参照であることを意味した。 –

答えて

1

alter戻り値の型はbase&です。つまり、文bar.run(bar.alter(foo));bar.alter(foo)と評価され、fooへの参照がbase&として返されます。次にbase&という参照でbar.run()が呼び出されます。

ファンクションにbase&を指定し、1回のオーバーロードにはbase&が必要なため、警告は表示されません。渡された参照が本当にderivへの参照である場合

void run(base& type) { 
    deriv* derivTest = dynamic_cast<deriv*>(&type); 
    if(derivTest != nullptr) 
     run(*derivTest); 
    else 
     std::cout << "base" << std::endl; 
} 

このチェックをし、通話:あなたは、この特定のコードがrunderiv&オーバーロードを呼び出したい場合は、このような何かにbase&過負荷を変更する必要があります必要に応じて正しいrunポインター型を使用すると、dynamic_castが失敗した場合の例外が防止されます。

+0

こんにちは、申し訳ありませんが、私はこれらの方法が参考に値するものではないことを意味しました。 –

+0

私は自分の答えを更新しますが、コンパイラは 'base&'型を出力して関数の 'base&'オーバーロードを選択する関数を見ています。この場合、 'run'を' deriv& 'オブジェクトに対して異なって動作させたい場合、' dynamic_cast'を実行して失敗するかどうかを確認する必要があります。 –

関連する問題