Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 如何知道类型是否是std::vector的特化?_C++_Metaprogramming - Fatal编程技术网

C++ 如何知道类型是否是std::vector的特化?

C++ 如何知道类型是否是std::vector的特化?,c++,metaprogramming,C++,Metaprogramming,我整个上午都在讨论这个问题,结果一无所获。 基本上,我需要一个简单的元编程工具,它允许我在传递的参数是否是std::vector的情况下分支到不同的专门化 某种类型是模板的基础 这样的东西存在吗?没有,但是您可以使用只接受std::vector的模板函数重载。在这种情况下,编译器将选择最专门化的模板。如果您需要一个trait类,那么它非常简单,您只需要一个通用模板和一个针对任何std::vector的专门化: #include <type_traits> #include <i

我整个上午都在讨论这个问题,结果一无所获。 基本上,我需要一个简单的元编程工具,它允许我在传递的参数是否是std::vector的情况下分支到不同的专门化

某种类型是模板的基础


这样的东西存在吗?

没有,但是您可以使用只接受
std::vector
的模板函数重载。在这种情况下,编译器将选择最专门化的模板。

如果您需要一个trait类,那么它非常简单,您只需要一个通用模板和一个针对任何
std::vector
的专门化:

#include <type_traits>
#include <iostream>

template<typename>
struct is_std_vector : std::false_type {};

template<typename T, typename A>
struct is_std_vector<std::vector<T,A>> : std::true_type {};

int main()
{
    typedef std::vector<int> vec;
    typedef int not_vec;
    std::cout << is_std_vector<vec>::value << is_std_vector<not_vec>::value;
}
#包括
#包括
模板
struct是std向量:std::false_type{};
模板
结构是_std_vector:std::true_type{};
int main()
{
typedef std::向量向量;
typedef int not_vec;

std::cout在C++11中,您还可以用更通用的方式执行:

#include <type_traits>
#include <iostream>
#include <vector>
#include <list>

template<typename Test, template<typename...> class Ref>
struct is_specialization : std::false_type {};

template<template<typename...> class Ref, typename... Args>
struct is_specialization<Ref<Args...>, Ref>: std::true_type {};


int main()
{
    typedef std::vector<int> vec;
    typedef int not_vec;
    std::cout << is_specialization<vec, std::vector>::value << is_specialization<not_vec, std::vector>::value;

    typedef std::list<int> lst;
    typedef int not_lst;
    std::cout << is_specialization<lst, std::list>::value << is_specialization<not_lst, std::list>::value;
}
#包括
#包括
#包括
#包括
模板
结构是_专门化:std::false_类型{};
模板
结构是_专门化:std::true_类型{};
int main()
{
typedef std::向量向量;
typedef int not_vec;

std::cout With“specialization”您是指继承?还是类型别名(例如
typedef
)?或者特定类型的专用实现(例如
std::vector
is)?您的问题很模糊:如果您想确定某个类型是否是某个类型的
std::vector
的模板专用化,您不应该能够这样做(无论如何不是以干净的方式)。如果要确定类型是否从std::vector继承,则明确建议不要这样做(std::vector没有虚拟析构函数,不应继承,只应封装)。如果要确定class/typedef/template参数是否为std::vector,则应使用模板化的traits类(参见jrok的答案)。@utnapistim:一般来说,检查类型是否是模板的专门化并不难。@DavidRodríguez dribeas-我的意思不是检查类型是否是std::vector,而是检查是否有一个模板类vector特定的实现(类似于jirok回答中的
struct is_std_vector
struct is_std_vector
的具体实现)。有没有办法做到这一点?@utnapistim:我想这只是一个误解,因为在标准中过度使用了术语“专门化”,即对一组模板参数有单独的定义,以及在替换基础模板中的模板参数后生成的类型/函数。好的,你是ri吗因为您无法检测特定模板参数集是否有不同的定义。为了完整起见,您应该专门处理
vector
,以便使用自定义分配器捕获向量。另外请注意:允许实现添加额外的模板参数,因此您可能需要检查。尽管上面的code将检测使用可能附加模板参数的默认值的向量的每个实例化。如果要捕获所有扩展,可以使用
template struct is_std_vector:std::true_type{}
@DavidRodríguez dribea是个好消息!经过一些考古研究,我发现这为我指明了正确的方向。反过来,信息链接到,将我们带回到1998年。(愚蠢的我开始寻找语言问题…)@LucDanton:与一些委员会成员进行了复查,他们确认了最初的意图是支持额外的模板参数,但当模板参数实际实现时(在语言级别)他们发现这是不可能的。现在,标准库中的类型不允许接受任何额外的参数。嗨!这个示例如何更改为也支持包含非类型模板参数的std::array?不,我不这么认为。这是因为没有类型名或值类型的通用机制,并且可以持有类型或具体值。抱歉,我认为您必须编写一个特殊的is_std_数组模板。这是一个很好的示例。对于初学者来说,如果有人建议添加此泛型类型特征,请参见