LINUX.ORG.RU

магия шаблонов - как написать две разных ф-ии с одинаковой сигнатурой?

 


0

3

Хочется странного. Надо сваять код навроде:

template <typename C, typename T=typename C::cell_type> class wrapper {
C arr;
...
T operator []( ... ){ return  C[...]; 
};

C[...] возвращает С::cell_type&, который к T приводится далеко не всегда, а собираться враппер должен всегда - мне проще поймать ошибку в рантайме (если до вызова [] дойдет) чем ловить ошибку компиляции питонячьего модуля, в который все в итоге протаскивается, и не инстацировать враппер. Ладно, делаем как то так:

template <class T1, class T2> T2 convert_cell( const T1& src, const T2& dst ){ 
    throw "can't convert cell"; 
    return dst; 
}
template <class T> T convert_cell( const T& src, const T& dst ){ return src; }
template <typename C, typename T=typename C::cell_type> class wrapper {
C arr;
...
T operator []( ... ){ return  convert_cell( C[...], T() ); 
};

Все работает, но теперь хочется наклепать convert_cell-ов позволяющих конвертить те типы к-е по дефолту конвертятся (напр. double во float). Руками их перегружать получается дофига пар, хотелось бы сваять шаблон.... но такой шаблон уже есть (который исключение кидает);-(

В идеале - хотелось бы общее решение, позволяющее ковертить тип если это возможно, и подсовывающее ф-ю с исключением если это невозможно.

★★★★★
Ответ на: комментарий от r2d2

Куда мне... зато ты видимо все делаешь правильно, отвечая на вопрос, который не задавали;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от ratatosk

Спасибо, это забавное решение... с бустом толком не работал, но идеи у них тырил;-) Надо будет расковырять, как они это дело реализовали.

AIv ★★★★★
() автор топика
Ответ на: комментарий от r2d2

Ты что-то делаешь неправильно. Помнишь, что код читают в основном люди?

рукопожимаю

lazyklimm ★★★★★
()

две разных ф-ии с одинаковой сигнатурой?

если у вас возникла такая пробелма, вы явно на предыдущем этапе архитектурного проектирования что-то упустили.

JFreeM ★★★☆
()
Ответ на: комментарий от JFreeM

В примере к enable_if как раз решается похожая проблема. Или таких «упустивших» очень много, или другого выхода просто нет?

gag ★★★★★
()
Ответ на: комментарий от AIv

Спасибо, это забавное решение...

Добавлю, что в C++11 есть std::enable_if и std::is_convertible.

Begemoth ★★★★★
()
Ответ на: комментарий от AIv

Надо будет расковырять, как они это дело реализовали.

На SFINAE, в std::enable_if<true, T> есть typedef T type, а в std::enable_if<false, T> нет.

Begemoth ★★★★★
()
Ответ на: комментарий от AIv

AIv я тебя почему то представляю добрым дедушкой )))

anonymous
()
Ответ на: комментарий от Begemoth

Спасибо всем ответившим. Курю Вандервуда....

AIv ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

Классно! Все оказалось просто, как апельсин;-)

template <class T> T convert_cell( const T& x ){ return x; } 
template <class T> T convert_cell( ... ){ 
    throw "can't convert type'"; 
    return T(); 
}
template <typename C, typename T=typename C::cell_type> class wrapper {
C arr;
...
T operator []( ... ){ return  convert_cell<T>( C[...] ); 
};
Это даже не SFINAE, а просто правило разрешения неоднозначностей c ... работает.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

просто правило разрешения неоднозначностей c ... работает.

Не прокатит с классами с нетривиальным конструктором копирования.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

И правда... тогда sizeof и SFINAE, будет чуть вырвиглазнее.

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.