Re: convert_cast?
От: VTT http://vtt.to
Дата: 31.10.16 21:25
Оценка:
Здравствуйте, turbocode, Вы писали:

T>
T>template<class InterfaceType>
T>class Convert
T>{
T>public:
T>   static DerivedType1<IDerivedType1> Cast(const BaseType<IBaseType>& base_type, void* fake_type = 0);
T>   static DerivedType2<IDerivedType2> Cast(const BaseType<IBaseType>& base_type, int* fake_type = 0);

T>private:
T>   Convert();
T>   ~Convert();
T>}

T>DerivedType1<IDerivedType1> result = Convert<IDerivedType1>::Cast(test, (void*)0);
T>


T>Как заставить компилятор генерировать fake_type автоматически чтобы не возникало redifinition и чтобы вызов свести к виду:

T>
T>DerivedType1<IDerivedType1> result = Convert<IDerivedType1>::Cast(test);
T>


T>Или это невозможно?


fake_type не нужны.
В таких ситуациях следует делать метод кастования шаблонными, а реализовывать кастование как статический метод в (частичной) специализации шаблона класса.
Тогда при вызове второй аргумент шаблона будет выводится автоматом:
template< typename tp_Required, typename tp_Original, typename tp_Enable = void > class
t_ExplicitCastImpl; // специализации содержат статический метод Cast(tp_Original & original) -> tp_Required &

template< typename tp_Required, typename tp_Original > decltype(auto)
explicit_cast(tp_Original & original) throw()
{
    return(t_ExplicitCastImpl< tp_Required, tp_Original >::Cast(original));
}
...
IBaseType test;
auto & result(explicit_cast< IDerivedType1 & >(test));
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.