模板规范不存在的属性

时间:2019-06-17 01:03:09

标签: c++ templates

最有可能是一个经过充分讨论的问题,但我只是不知道如何正确搜索它。我有两种规格的模板函数:指向 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 类型创建新功能,因为它完全消除了使用模板的所有原因。

1 个答案:

答案 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