工作函数指针模板给出了Netbeans错误

时间:2015-07-11 17:10:03

标签: c++ netbeans

我有一组函数不带参数并返回一个整数,我想在C ++ 03中缓存它们的结果。

刷新我的函数指针语法后,我写道:

#include <iostream>

int return_one() {
    std::cout << "Calling one\n";
    return 1;
}
int return_two() {
    std::cout << "Calling two\n";
    return 2;
}
template <int(*f)()>       // line 11
int cached() {
    static int x = f();    // line 13
    return x;
}

int main() {
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
}

打印哪些:

Calling 1
1
Calling 2
2
1
2
1
2

一切对我来说都很好。

但是,Netbeans在第11行和第13行强调f,抱怨“无法解析标识符f”为错误。我可以单击“运行项目(F6)”按钮,程序会愉快地编译并运行。

为什么Netbeans会抱怨我的模板参数?

对于奖励积分,我没有参数的函数集,但有些返回int,有些返回bool。我只是要复制粘贴我的模板,每个函数返回类型一个。是否有一个模板可用于处理两种返回类型?

1 个答案:

答案 0 :(得分:0)

您可以插入typedef以摆脱红线:

typedef int(*f);

template <int(*f)()>       // line 11
int cached() {
    static int x = f();    // line 13
    return x;
}

让它与其他类型一起使用:

typedef int(*f); // Keeps warning away - again

template <class T, T(*f)()>       // line 11
T cached() {
    static T x = f();    // line 13
    return x;
}

你必须添加另一个模板参数。

<强>示例:

bool return_bool()
{
    std::cout << "Calling bool\n";
    return true;
}

float return_float()
{
    std::cout << "Calling float\n";
    return 0.31f;
}

std::string return_string()
{
    std::cout << "Calling std::string\n";
    return "abc";
}

// ...

std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';
std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';
std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';

std::cout << cached<bool, return_bool>() << '\n';
std::cout << cached<bool, return_bool>() << '\n';
std::cout << cached<float, return_float>() << '\n';
std::cout << cached<float, return_float>() << '\n';
std::cout << cached<std::string, return_string>() << '\n';
std::cout << cached<std::string, return_string>() << '\n';

<强>输出:

Calling one
1
Calling two
2
1
2
1
2
Calling bool
1
1
Calling float
0.31
0.31
Calling std::string
abc
abc