Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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;
}