Случайный вопрос ...
То, что я ищу, - это способ выражения операции приведения, который использует определенный оператор экземпляра класса, из которого я выполняю приведение, и генерирует ошибку во время компиляции, если не определен оператор приведения для типа , Например, я ищу что-то вроде:
template< typename RESULT_TYPE, typename INPUT_TYPE >
RESULT_TYPE operator_cast( const INPUT_TYPE& tValue )
{
return tValue.operator RESULT_TYPE();
}
// Should work...
CString sString;
LPCTSTR pcszString = operator_cast< LPCTSTR >( sString );
// Should fail...
int iValue = 42;
DWORD dwValue = operator_cast< DWORD >( iValue );
Интересное примечание: приведенный выше код приводит к сбою компилятора VS2005 C ++ и некорректной компиляции в компиляторе VS2008 C ++ из-за того, что я предполагаю, что это ошибка компилятора, но, надеюсь, демонстрирует эту идею.
Кто-нибудь знает какой-нибудь способ добиться этого эффекта?
Редактировать: больше объяснения, чтобы объяснить, почему вы можете использовать это. Скажем, у вас есть класс-оболочка, который должен инкапсулировать или абстрагировать тип, и вы приводите его к инкапсулированному типу. Вы можете использовать static_cast <>, но это может сработать, когда вы хотите, чтобы он потерпел неудачу (то есть: компилятор выбирает оператор, которому разрешено преобразование в тип, который вы запрашивали, когда вы хотели сбоя, потому что этот оператор отсутствует).
По общему признанию, это необычный случай, но раздражает, что я не могу точно выразить то, что я хочу, чтобы компилятор делал в инкапсулированной функции ... отсюда и вопрос.