我有一组函数不带参数并返回一个整数,我想在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
。我只是要复制粘贴我的模板,每个函数返回类型一个。是否有一个模板可用于处理两种返回类型?
答案 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