いいえ、明示的に使用することはできませんが、テンプレート化された関数を使用して、不適切なパラメーターの型をキャッチできます。
C++11では、テンプレート化された関数をdelete
dとして宣言できます。簡単な例を次に示します。
#include <iostream>
struct Thing {
void Foo(int value) {
std::cout << "Foo: value" << std::endl;
}
template <typename T>
void Foo(T value) = delete;
};
パラメータを指定Thing::Foo
して呼び出そうとすると、次のエラー メッセージが表示されます。size_t
error: use of deleted function
‘void Thing::Foo(T) [with T = long unsigned int]’
C++11 より前のコードでは、代わりに未定義のプライベート関数を使用して実現できます。
class ClassThatOnlyTakesBoolsAndUIntsAsArguments
{
public:
// Assume definitions for these exist elsewhere
void Method(bool arg1);
void Method(unsigned int arg1);
// Below just an example showing how to do the same thing with more arguments
void MethodWithMoreParms(bool arg1, SomeType& arg2);
void MethodWithMoreParms(unsigned int arg1, SomeType& arg2);
private:
// You can leave these undefined
template<typename T>
void Method(T arg1);
// Below just an example showing how to do the same thing with more arguments
template<typename T>
void MethodWithMoreParms(T arg1, SomeType& arg2);
};
この場合の欠点は、コードとエラー メッセージが明確でないことです。そのため、C++11 オプションが利用可能な場合はいつでも選択する必要があります。
bool
またはを取るすべてのメソッドに対して、このパターンを繰り返しますunsigned int
。メソッドのテンプレート化されたバージョンの実装を提供しないでください。
これにより、ユーザーは常に bool または unsigned int バージョンを明示的に呼び出す必要があります。
またはMethod
以外の型で呼び出そうとすると、コンパイルに失敗します。これは、メンバーがプライベートであるためです。もちろん、可視性ルールの標準例外 (フレンド、内部呼び出しなど) の対象となります。アクセス権のあるものがプライベート メソッドを呼び出すと、リンカー エラーが発生します。bool
unsigned int