Я пытаюсь автоматически сгенерировать функцию-функцию const
с некоторыми шаблонами. Пожалуйста, помогите мне скомпилировать этот код.простая ошибка дедукции шаблона
template<typename T>
struct Constifier
{
typedef T Type;
};
template<typename T>
struct Constifier<T &>
{
typedef const T &Type;
};
template<typename T>
struct Constifier<T &&>
{
typedef const T &&Type;
};
template<typename T>
struct Constifier<T *>
{
typedef const T *Type;
};
template<typename F>
struct ReturnType;
template<typename R, typename ...Ts>
struct ReturnType<R (*)(Ts ...ts)>
{
typedef R Type;
};
template<typename R, typename T, typename ...Ts>
struct ReturnType<R (T::*)(Ts ...ts)>
{
typedef R Type;
};
template<typename T, typename F, typename ...Ts>
auto callConstVersion(const T *t, F f, Ts ...ts)
{
return const_cast<typename Constifier<typename ReturnType<F>::Type>::Type>((const_cast<T *>(t)->*f)(ts...));
}
struct A
{
A *p;
A *get() {return p;}
const A *get() const {return callConstVersion(this, &A::get);}
};
'get' перегружен, вам понадобится нечто вроде' static_cast (& A :: get) ' –
@PiotrSkotnicki Я тоже думал об этом, но я не может мыслить способ отличить правильный перегруженный неконтакт '' get'. – xiver77
@PiotrSkotnicki Я попробую это. – xiver77