2016-10-26 2 views
5

ユーザーは、暗黙的に定義されたバージョンと同等の機能を持つ関数を実装することがあります。たとえば、単にすべてのメンバーのコピーコンストラクタを呼び出すコピーコンストラクタです。ユーザー定義関数が暗黙的関数と同等かどうかを自動的に決定

struct A 
{ 
    int B; 
    A(const A& a) : B(a.B) { } 
} 

それはクラスのメンバーはなど、並べ替え/名前を変更している場合など、追加のメンテナンスを引き起こし、読みやすさを減らすため、これは、望ましくありません。また、これらの関数を追加すると、std::is_trivially_copy_constructableのような関数は、型を単純にコピーすることはできないと主張しています(実際には実際には可能です)。

私はコードベースを持っていますが、これは一般的なものですが、これらの実装を削除することで修正したいと思います。しかし、暗黙の実装と同じように見える機能を削除することは、実際には同等ではない場合があるため、私は不安です。関数がその暗黙のバージョンと同等かどうかを判断する方法はありますか? (任意のツールセット/言語のバリエーション/ etcの使用は可能です)。

+0

"これらの2つの機能は同じ"または "これらの2つの機能が異なる"というアルゴリズムを作成することは一般的に不可能です。しかし、これらの答えの1つ、または「わからない」アルゴリズムを作成することは可能です。 「よく分からない」とは言わない限り、このようなツールは便利です。 LLVMツールキット(clang)から何かを構築できますか? –

+0

私はLLVMツールキットの経験がありません。 – MuertoExcobito

+0

どちらもありません。静的アナライザーを構築できるツールを提供することを目指していることはわかります。http://llvm.org/特に、http://clang-analyzer.llvm.org/にチェッカーまたはコンパイラの警告です。 –

答えて

2

の差異が実際にはである可能性があり(通常のデフォルト動作を想定していたため)、これらの機能がデフォルトの実装と同じであるかどうかをプログラムで判断しないことをお勧めします。

代わりに、さまざまな機能のの動作が予想されるかどうかをテストするための単体テストセットを書き留めておき、それがデフォルトの実装を継承していることを確認することをお勧めします。そして、機能があなたが望んだことを自信を持って行うことができる将来の拡張のためのテストフレームワークを持っているだけでなく、

+0

これは良い答えだと思うが、私が避けようとしていた、コード保守(書込みとユニットテストの保守)の追加レベルが必要になる。 – MuertoExcobito

関連する問題