Я пишу функтор F, который выполняет функцию типа void (* func) (T) и аргумента func arg.get const или non-const reference type from trait
template<typename T>
void F(void (*func)(T), WhatTypeHere? arg)
{
func(arg);
}
Тогда функтор F вызывает func с arg. Я бы хотел, чтобы F не копировал arg, просто чтобы передать его в качестве ссылки. Но тогда я не могу просто написать «void F (void (* func) (T), T &)», поскольку T может быть ссылкой. Так что я пытаюсь написать черту, которая позволяет получить надлежащую ссылочный тип Т:
T -> T&
T& -> T&
const T -> const T&
const T& -> const T&
я придумать что-то вроде этого:
template<typename T>
struct type_op
{
typedef T& valid_ref_type;
};
template<typename T>
struct type_op<T&>
{
typedef typename type_op<T>::valid_ref_type valid_ref_type;
};
template<typename T>
struct type_op<const T>
{
typedef const T& valid_ref_type;
};
template<typename T>
struct type_op<const T&>
{
typedef const T& valid_ref_type;
};
template<typename T>
void F(void (*func)(T), typename type_op<T>::valid_ref_type arg)
{
func(arg);
}
Который не работает, например, для
void a(int x) { std::cout << x << std::endl; }
F(&a, 7);
ошибка Отдает: недействителен инициализация неконстантного ссылки типа «Int &» из временного типа «INT» при прохождении аргумента 2 of 'void F (void (*) (T), typename type_op :: valid_ref_type) [с T = int]'
Как получить эту признак на работу?
Я думаю, что это очень похоже на этот: http://stackoverflow.com/questions/2539361/c-template-functor-cannot-deduce-reference-type –