我正在编写一个仿函数 F,它采用 void (*func)(T) 类型的函数和 func 的参数 arg。
template<typename T>
void F(void (*func)(T), WhatTypeHere? arg)
{
func(arg);
}
然后仿函数 F 用 arg 调用 func。我希望 F 不要复制 arg,只是将其作为参考传递。但是我不能简单地写“void F(void (*func)(T), 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);
给出错误:在传递 'void F(void (*)(T), typename type_op::valid_ref_type) [with T =整数]'</p>
如何让这个特性发挥作用?