Нет, вы не можете использовать явное, но вы можете использовать шаблонную функцию, чтобы перехватывать неправильные типы параметров.
В 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]’
В коде pre-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
, не будет скомпилирована, потому что член является закрытым, конечно, с учетом стандартных исключений из правил видимости (друг, внутренние вызовы и т. д.). Если что-то, у кого есть доступ, вызывает закрытый метод, вы получите ошибку компоновщика.
person
Patrick Johnmeyer
schedule
06.10.2008