4

特定の関数が呼び出されないようにしたい。関数ポインタなどを介して関数を呼び出すケースは無視して、関数を直接呼び出すケースだけに集中しましょう。でこれを行うことができます= delete。ただし、発行された診断はあまり有益ではありません。static_assertカスタム診断メッセージを提供できる を使用することを検討しました。static_assert(false, ...)関数が呼び出されたときに実行されることを期待して、関数本体内にステートメントを配置しました。ただし、static_assert関数が呼び出されなくても失敗することがわかりました。助言がありますか?

追記:無条件に禁止されている機能です。したがって、std::enable_ifここでは適用されません。このような関数の動機は、特定の使用を防止したいということです。それ以外の場合は、オーバーロード解決で正常にコンパイルされます。したがって、機能を削除することはできません。deprecated私が欲しいものではありません。警告ではなく、コンパイル エラーが必要です。

4

2 に答える 2

4

それがメンバー関数である場合= deleteは、最善の (最もポータブルな) 賭けです。それ以外の場合、GCC と MSVC の両方が、関数を「非推奨」としてマークすることをサポートしています。これにより、関数が呼び出されたときにコンパイラが警告を発行します。

C++からdeprecated としてマーク:

#ifdef __GNUC__
#define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED(func) __declspec(deprecated) func
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED(func) func
#endif

使用法:

DEPRECATED(void badidea(int a, const char* b));

....そして、C++ 14 では、次のように記述できます。

#define DEPRECATED(func, reason) [[deprecated(reason)]] func

使用法:

DEPRECATED( void badidea(int a, const char* b), "This function was a bad idea");
于 2016-01-12T14:04:21.617 に答える