最有可能是一个经过充分讨论的问题,但我只是不知道如何正确搜索它。我有两种规格的模板函数:指向 int 的指针和 int 的 vector 。在此函数中,我有一个参数 N ,它是 int s数组的长度。如果使用 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 类型创建新功能,因为它完全消除了使用模板的所有原因。
答案 0 :(得分:1)
您可以使用if constexpr(从C ++ 17开始)丢弃未完成的语句。
如果值为
true
,则将丢弃 statement-false (如果存在),否则,将丢弃 statement-true 。
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之前,您需要为T = std::vector<int>&
提供一个full specialization。