c++;具有非任意参数的函数模板 考虑这个C++代码,它工作得很好: template <size_t N> int check(std::array<unsigned char, N> buf){ std::cout << N << "-" << buf.size() << std::endl; return 0; } int main (int argc, char *argv[]) { std::array<unsigned char, 20> a; std::array<unsigned char, 30> b; std::array<unsigned char, 40> c; check(a); check(b); check(c); return 0; } 模板 整数检查(std::数组buf){ std::cout
您可以使用:c++;具有非任意参数的函数模板 考虑这个C++代码,它工作得很好: template <size_t N> int check(std::array<unsigned char, N> buf){ std::cout << N << "-" << buf.size() << std::endl; return 0; } int main (int argc, char *argv[]) { std::array<unsigned char, 20> a; std::array<unsigned char, 30> b; std::array<unsigned char, 40> c; check(a); check(b); check(c); return 0; } 模板 整数检查(std::数组buf){ std::cout,c++,templates,C++,Templates,您可以使用: 模板 整数检查(std::数组buf){ 静态断言(N==20 | | N==30,“N的无效值”); 有几种方法可以做到这一点 一种方法是: template <size_t N> typename std::enable_if<N == 20 || N == 30, int>::type check(std::array<unsigned char, N> buf) { //.. } 模板 typename std::enable_if
模板
整数检查(std::数组buf){
静态断言(N==20 | | N==30,“N的无效值”);
有几种方法可以做到这一点
一种方法是:
template <size_t N>
typename std::enable_if<N == 20 || N == 30, int>::type
check(std::array<unsigned char, N> buf) {
//..
}
模板
typename std::enable_if::type
检查(标准::阵列buf){
//..
}
在其他答案中显示了一些关于在这和static\u assert
之间进行选择的想法:
static\u assert
可能被一些人视为比enable\u(如果
- (我认为最重要的区别是):这样,约束是函数接口的一部分,即函数的定义表示约束。
static\u assert
是实现的一部分。在更复杂的代码中,这甚至会影响函数重载的方式
- 使用
static\u assert
可以清楚地知道当约束未得到满足时哪里出了问题
如果N
不是20或30,则可以使用static\u assert
抛出编译时错误
template <size_t N>
int check(std::array<unsigned char, N> buf)
{
static_assert(N == 20 || N == 30, "N must be 20 or 30.");
std::cout << N << "-" << buf.size() << std::endl;
return 0;
}
模板
整数检查(std::数组buf)
{
静态断言(N==20 | | N==30,“N必须是20或30”);
std::cout另一种方法是删除函数:
template <size_t N>
void check(std::array<unsigned char, N> buf) = delete;
void check(std::array<unsigned char, 20> buf)
{
std::cout << 20 << "-" << buf.size() << std::endl;
}
void check(std::array<unsigned char, 30> buf)
{
std::cout << 30 << "-" << buf.size() << std::endl;
}
模板
无效检查(std::array buf)=删除;
无效检查(标准::数组buf)
{
std::cout如果您以不同的方式处理数组,那么模板在您的情况下是无用的。
只需提供一些重载:
#include <array>
#include <iostream>
int check(std::array<unsigned char, 20> buf){
std::cout << "Handling an array of size 20\n";
return 0;
}
int check(std::array<unsigned char, 30> buf){
std::cout << "Handling an array of size 30\n";
return 0;
}
int check(std::array<unsigned char, 40> buf){
std::cout << "Handling an array of size 40\n";
return 0;
}
int main (int argc, char *argv[])
{
std::array<unsigned char, 20> a;
std::array<unsigned char, 30> b;
std::array<unsigned char, 40> c;
check(a);
check(b);
check(c);
// std::array<unsigned char, 0> d;
//error: no matching function for call to ‘check(std::array<unsigned char, 0ul>&)'
//check(d);
return 0;
}
#包括
#包括
整数检查(std::数组buf){
std::您可能想了解一下。为了完整起见,您还可以研究部分模板专门化(不过静态断言是这里最简单的一个)但是您提供的实现是独立于模板的…?重载通常比函数的专门化要好。哦,好吧,如果我没有在其他地方使用模板代码,那么我实际上会删除模板代码…感谢您指出静态断言和比较的替代方案。
#include <array>
#include <iostream>
int check(std::array<unsigned char, 20> buf){
std::cout << "Handling an array of size 20\n";
return 0;
}
int check(std::array<unsigned char, 30> buf){
std::cout << "Handling an array of size 30\n";
return 0;
}
int check(std::array<unsigned char, 40> buf){
std::cout << "Handling an array of size 40\n";
return 0;
}
int main (int argc, char *argv[])
{
std::array<unsigned char, 20> a;
std::array<unsigned char, 30> b;
std::array<unsigned char, 40> c;
check(a);
check(b);
check(c);
// std::array<unsigned char, 0> d;
//error: no matching function for call to ‘check(std::array<unsigned char, 0ul>&)'
//check(d);
return 0;
}