コンパイル時に、一部のクラスの一部の関数が使用されているかどうかを確認し、それに応じてコンパイルプロセスを失敗/通過させたいと思います。
たとえば、関数F1
がコードのどこかで呼び出された場合はコンパイルを成功させ、関数F2
が呼び出された場合はコンパイルを失敗させます。
プリプロセッサ、テンプレート、またはその他の c++ メタプログラミング手法を使用して、それを行う方法に関するアイデアはありますか?
コンパイル時に、一部のクラスの一部の関数が使用されているかどうかを確認し、それに応じてコンパイルプロセスを失敗/通過させたいと思います。
たとえば、関数F1
がコードのどこかで呼び出された場合はコンパイルを成功させ、関数F2
が呼び出された場合はコンパイルを失敗させます。
プリプロセッサ、テンプレート、またはその他の c++ メタプログラミング手法を使用して、それを行う方法に関するアイデアはありますか?
F2 を変更して関数本体に static_assert を含め、シグネチャにダミー テンプレートを追加する場合は、c++11 コンパイラでこれを実現できます。
#include <type_traits>
void F1(int) {
}
template <typename T = float>
void F2(int) {
static_assert(std::is_integral<T>::value, "Don't call F2!");
}
int main() {
F1(1);
F2(2); // Remove this call to compile
}
F2 の呼び出し元が存在しない場合、コードはコンパイルされます。テンプレートのトリックが必要で、単純に挿入できない理由については、この回答を参照してください。static_assert(false, "");
非常にテンプレート的なソリューションではありませんが、代わりに、関数がどこかで使用されている場合に警告を生成するコンパイラの非推奨属性に依存できます。
MSVC の場合、__declspec (非推奨)属性を使用します。
__declspec(deprecated("Don't use this")) void foo();
G++:
void foo() __attribute__((deprecated));
「警告をエラーとして扱う」コンパイルオプションをオンにしている場合(通常はそうする必要があります)、目的の動作が得られます。
int main()
{
foo(); // error C4966: 'foo': Don't use this
return 0;
}