Делаю такую вещь:
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.
Как???