将函数作为参数传递给模板返回值

时间:2015-03-31 16:13:40

标签: c++ templates

我有一些c ++函数,如下所示:

template<class T> bool function(QString *text, T number, T (*f)(QString, bool)){
    bool ok = true;
    QString c = "hello";
    T col = (*f)(c, &ok);
    // do something with col here ...
    return true;
 }

我是以外面的方式从外面打电话

double num = 0.45;
double (*fn)(QString, bool) = &doubleFromString;
function(&text, num, fn);

和(已编辑)

unsigned int num = 5;
int (*fn)(QString, bool) = &intFromString;
function(&text, num, fn);

我收到错误

template parameter T is ambigious

我猜这个问题在于组合模板和传递函数作为参数,但我不知道如何解决这个问题。 (我不想用不同的类型写两次函数)。有解决方案吗

1 个答案:

答案 0 :(得分:1)

错误消息表明T的模板参数推断不一致 - 即返回的fn类型和num的类型在您的第二个代码段中有所不同。

这可以通过几种方式解决,其中以下一种可能是最简单的方法:

template<class T, class R>
bool function(QString *text, T number, R (*f)(QString, bool)) {
    // [..]
    T col = f(c, &ok); // Cast if necessary. Dereferencing is superfluous, btw.
    // [..]
    return true;
 }

或者,甚至比这简单,

template<class T, class F>
bool function(QString *text, T number, F f) {
    bool ok = true;
    QString c = "hello";
    T col = f(c, &ok);
    // [..]
    return true;
 }