convert_cast?
От: turbocode  
Дата: 31.10.16 21:01
Оценка:
template<class InterfaceType>
class Convert
{
public:
   static DerivedType1<IDerivedType1> Cast(const BaseType<IBaseType>& base_type, void* fake_type = 0);
   static DerivedType2<IDerivedType2> Cast(const BaseType<IBaseType>& base_type, int* fake_type = 0);

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

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


Как заставить компилятор генерировать fake_type автоматически чтобы не возникало redifinition и чтобы вызов свести к виду:
DerivedType1<IDerivedType1> result = Convert<IDerivedType1>::Cast(test);


Или это невозможно в С++03?
Отредактировано 31.10.2016 21:32 turbocode . Предыдущая версия .
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));
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[2]: convert_cast?
От: turbocode  
Дата: 31.10.16 21:30
Оценка:
Здравствуйте, VTT, Вы писали:

еще, забыл С++03
Re[3]: convert_cast?
От: VTT http://vtt.to
Дата: 31.10.16 21:41
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Здравствуйте, VTT, Вы писали:


T>еще, забыл С++03


Описанная идея должна работать и под ним.
В примере есть автоматический вывод типа и аргумент шаблона по-умолчанию, но это не существенно.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[4]: convert_cast?
От: turbocode  
Дата: 31.10.16 21:48
Оценка:
VTT>Описанная идея должна работать и под ним.
VTT>В примере есть автоматический вывод типа и аргумент шаблона по-умолчанию, но это не существенно.

По-моему твой пример жестко упирается в С++11 auto
Re[5]: convert_cast?
От: VTT http://vtt.to
Дата: 31.10.16 21:57
Оценка:
Здравствуйте, turbocode, Вы писали:

VTT>>Описанная идея должна работать и под ним.

VTT>>В примере есть автоматический вывод типа и аргумент шаблона по-умолчанию, но это не существенно.

T>По-моему твой пример жестко упирается в С++11 auto


Нет, в это точно не упирается.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[6]: convert_cast?
От: turbocode  
Дата: 31.10.16 22:09
Оценка:
T>>По-моему твой пример жестко упирается в С++11 auto
VTT>Нет, в это точно не упирается.

Не было decltype(auto) в C++03
Re[7]: convert_cast?
От: VTT http://vtt.to
Дата: 31.10.16 22:13
Оценка:
Здравствуйте, turbocode, Вы писали:

T>>>По-моему твой пример жестко упирается в С++11 auto

VTT>>Нет, в это точно не упирается.

T>Не было decltype(auto) в C++03


Не было, и просто auto не было, но их использовать совсем не обязательно, можно явно написать тип.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.