【发布时间】:2011-12-14 09:19:30
【问题描述】:
请考虑下面的代码:
template<typename T>
bool function1(T some_var) { return true; }
template <typename T>
bool (*function2())(T) {
return function1<T>;
}
void function3( bool(*input_function)(char) ) {}
如果我打电话
function3(function2<char>());
没关系。但如果我打电话
function3(function2());
编译器报错,无法推断模板的参数。
您能否建议(给出一个想法)如何重写 function1 和/或 function2(可能从根本上使用类重写)以使其正常?
* 已添加 *
我正在尝试在 Boost.LambdaLib 中做一些简单的事情,比如 lambda 表达式(可能是,我走错了路):
sort(some_vector.begin(), some_vector.end(), _1 < _2)
我这样做了:
template<typename T>
bool my_func_greater (const T& a, const T& b) {
return a > b;
}
template<typename T>
bool my_func_lesser (const T& a, const T& b) {
return b > a;
}
class my_comparing {
public:
int value;
my_comparing(int value) : value(value) {}
template <typename T>
bool (*operator<(const my_comparing& another) const)(const T&, const T&) {
if (this->value == 1 && another.value == 2) {
return my_func_greater<T>;
} else {
return my_func_greater<T>;
}
}
};
const my_comparing& m_1 = my_comparing(1);
const my_comparing& m_2 = my_comparing(2);
有效:
sort(a, a + 5, m_1.operator< <int>(m_2));
但我希望它不需要像 LambdaLib 中那样的模板参数。
【问题讨论】:
-
类在这里没有帮助,因为模板参数推导对它们不起作用。您的问题本质上归结为根据返回类型推断参数类型,这是不可能的。
-
function3(function2<char>());有什么问题? -
你能改一下
function3还是那是刻在石头上的? -
你能解释一下
function2的定义吗?我以为我是一个称职的 C++ 程序员,但我完全无法解析。 -
@jalf:这是一个函数,它返回一个指向函数的指针,该函数获取
T并返回bool。如果你不能立即解析它,我认为这表明你确实是一个优秀的 C++ 程序员(我不得不回到 C-days 的深处才能弄清楚)。