gpt4 book ai didi

c++ - 模板规范的不存在属性

转载 作者:行者123 更新时间:2023-11-28 04:16:04 25 4
gpt4 key购买 nike

很可能这是一个经过充分讨论的问题,但我只是不知道如何正确地用谷歌搜索它。我有两个规范的模板函数:指向 int 的指针和 intvector。在这个函数中,我有一个参数 N,它是 int 数组的长度。如果我使用vector,我想检查这个N是否与x.size()相同,所以我的代码是这样的:

// foo.cpp
#include "foo.h"
template void foo<int *>(int *, int);
template void foo<std::vector<int>&>(std::vector<int>&>,int);
template <class T>
void foo(T x, int N){
if ( std::is_same<T, std::vector<int>&>::value && N!=x.size() ) {
// do something
}
}

//foo.h
template <class T>
void foo(T x, int N);

这里的问题是对于 int 数组没有方法 size()。我用 AND 运算符制作了 if 语句,这样如果第一部分失败就不会调用第二部分,我希望编译器能猜到这一点,但它无论如何都没有编译。

有没有简单的解决方案?我不想专门为 vector 类型创建一个新函数,因为它完全消除了使用模板的所有原因。

最佳答案

您可以使用 if constexpr (C++17 起)丢弃不需要的语句。

If the value is true, then statement-false is discarded (if present), otherwise, statement-true is discarded.

template <class T>
void foo(T x, int N){
if constexpr ( std::is_same<T, std::vector<int>&>::value ) {

// only for T = std::vector<int>&
if ( N!=x.size() ) {
// do something
}
}
}

在C++17之前,你需要提供一个full specialization对于 T = std::vector<int>& .

关于c++ - 模板规范的不存在属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com