我想写一个模板函数,只能用于2个数字(例如3和5),并给出错误,如果你尝试使用它与另一个数字。关于ints的专业化,和static_assert
我可以这样做:
template<int x>
void f();
template<>
void f<3>()
{
cout << "f<3>()\n";
}
template<>
void f<5>()
{
cout << "f<5>()\n";
}
,然后我可以调用这个函数的正常方式:
f<3>();
f<5>();
并将其编译好了,如果我尝试使用我的功能不正确:
f<10>();
编译器给我一个错误。
我有这个方法的2个问题:
1.-是这个标准吗?我可以用ints专门设计一个模板吗?
2.-如果你使用这种方法,我不喜欢你得到的错误,因为错误不会告诉用户他错误地做了什么。我更喜欢写这样的东西:
template<int x>
void f()
{
static_assert(false, "You are trying to use f with the wrong numbers");
}
但这不能编译。看来我的编译器(gcc 5.4.0)试图首先实例化主模板,并且因为它提供了错误(static_assert)。
谢谢你的帮助。
如果你想知道为什么我想这样做,是因为我正在学习如何编程一个微控制器。在微控制器中,你有一些只能做一些事情的引脚。例如,引脚3和5是可以产生方波的引脚。如果一个应用程序,我想产生方波,我想写的财产以后,如:
square_wave<3>(frecuency);
但是,如果几个月后,我想重用这个代码(或修改)在另一个应用程序与differente微控制器,我想我的编译器对我说:“呃,在这个微控制器中,你不能在引脚3和5上产生方波,而是使用引脚7和9”。我认为这可以为我节省很多麻烦(或者不是,我真的不知道,我只是在学习如何编程一个微控制器)。
“_but这并不compile_” 什么是编译错误?用哪个测试? ''f <10>()''不应该使用静态断言进行编译。 – nefas
@nefas它不能用_any_值的'x'进行编译。 –