Напишите get_last
, который извлекает последний элемент пакета параметров.
Назовите его f
. Позвоните по телефону f
.
В качестве примера,
template<typename T0>
auto get_last(T0&& t0)->decltype(std::forward<T0>(t0))
{
return std::forward<T0>(t0);
}
template<typename T0, typename... Ts>
auto get_last(T0&& t0, Ts&&... ts)->decltype(get_last(std::forward<Ts>(ts)...))
{
return get_last(std::forward<Ts>(ts)...);
}
, если вы не заботитесь о разрешении перегрузки, просто звоню get_last
и рассматривая его как функтора может быть достаточно:
template <typename...Args>
void call(const char *name, Args...&& args)
{
auto&& f = get_last(std::forward<Args>(args)...);
f(3);
}
Следующим шагом будет чтобы сделать магию SFINAE enable_if
, чтобы сделать call
не в силе, если вы не пройдете действительный функтор последним: однако это, вероятно, слишком велико.
Чтобы обнаружить, если f(3)
будет работать, простой черты класса:
// trivial traits class:
template<typename T>
struct is_type:std::true_type {};
template<typename Functor, typename=void>
struct can_be_called_with_3:std::false_type {}
template<typename Functor>
struct can_be_called_with_3<Functor,
typename std::enable_if<
std::is_type< decltype(
std::declval<Functor>(3)
) >::value
>::type
>:std::true_type {}
который довольно глупо. Класс приоритетных черт должен использоваться, если ваши требования к переданному типу более сложны (скажем, вы хотите, чтобы его вызывали с аргументами).
Тогда вы увеличить call
с:
template <typename...Args>
auto call(const char *name, Args...&& args)
-> typename std::enable_if<
can_be_called_with_3< decltype(get_last(std::forward<Args>(args)...)) >::value
>::type
{ /* body unchanged */ }
который довольно тупые.
Можете ли вы REORDER аргументов? – zch
Аргумент name - это метод, а аргументы - аргументы метода, функция func - это функция обратного вызова. Таким образом, порядок кажется «естественным» таким образом. Поэтому я не хочу изменять порядок аргументов. –
В противном случае, правилом языка является то, что пакет параметров должен быть последним аргументом. –