как в template из ссылочного типа получить базовый?
От: Кодт Россия  
Дата: 19.09.03 14:27
Оценка:
Делаю такую вещь:
template<class T>
struct ByValue : public ByValueBase
{
  T t;

  typedef T Type;
  typedef typename Loki::TypeTraits<T>::ParameterType Param;

  ByValue() {}
  ByValue(Param v) : t(v) {}

  operator T&() { return t; }
  operator Param() const { return t; }
};

Особенность его — в том, что TypeTraits<ByValue<T> >::Param == ByValue<T>; для этих целей я немного расковырял Loki.
Это нужно для функторов, чтобы форсировать передачу туда данных по значению.
А именно — делать устойчивое связывание со временными объектами:
f = BindFirst(functor, something());
.....
f();


Но вот захотелось мне сделать так, чтобы выводить тип функтора, принимающего данные по значению, из функции. Пишу:
using namespace Loki;

template<class R, class P1, class P2, class P3>
Functor<R, TYPELIST_3(ByValue<P1>, ByValue<P2>, ByValue<P3> ) >
make_fn_byval( R(*fn)(P1,P2,P3) )
{
  return Functor<R, TYPELIST_3(ByValue<P1>, ByValue<P2>, ByValue<P3> ) > (fn);
}


Естественно, что
void hello_byval(A,B,C);
void hello_byref(const A&, const B&, const C&);

...
make_fn_byval(hello_byval)(a,b,c); // все окей
make_fn_byval(hello_byref)(a,b,c); // опаньки. Ошибки компиляции


Тупой способ — сделать множество сигнатур
make_fn_byval(R(*fn)(const P1&,P2,P3));
make_fn_byval(R(*fn)(P1,const P2&,P3));
...
// итого 2^n раз, где n - число параметром

В общем, нужен способ из ( Pk | const Pk& ) получить Pk.
Как???
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.