Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++;?_C++_Typeid - Fatal编程技术网

C++ 如何检查变量是否是C++;?

C++ 如何检查变量是否是C++;?,c++,typeid,C++,Typeid,编辑: 这个问题不是骗人的。这就是为什么… 我不想测试: 1) 如果给定类型是一个map(伪代码:type==“map”),但是 2) 如果给定变量的类型为map(伪代码:typeof(var)=“map”)。 拥有#1(如链接问题)是不够的。必须使用从var获取类型的函数来链接它。 到目前为止,我没有发现(typeid似乎不起作用) 现在是原始问题 我想检查给定变量var是否是map(无论第一个和第二个的类型如何),并且不声明任何其他变量 template<typename T>

编辑这个问题不是骗人的。这就是为什么…

我不想测试: 1) 如果给定类型是一个
map
(伪代码:
type==“map”
),但是 2) 如果给定变量的类型为
map
(伪代码:
typeof(var)=“map”
)。
拥有#1(如链接问题)是不够的。必须使用从
var
获取
类型的函数来链接它。
到目前为止,我没有发现(
typeid
似乎不起作用)


现在是原始问题

我想检查给定变量
var
是否是
map
(无论
第一个
第二个
的类型如何),并且不声明任何其他变量

template<typename T>
constexpr bool is_map(const T&) { return false; }

template<typename Key, typename Value, typename Order, typename Allocator>
constexpr bool is_map(const std::map<Key, Value, Order, Allocator>&) {
   return true;
}
这可能吗?怎么做? 注意:我不关心获取人类可读的表单“
map
”,而只关心获取布尔值(伪代码:
typeof(var)=“map”

Demanling(非便携)是唯一的方法吗?


在此处发布答案 (灵感来源于,它解决了类型而不是变量的问题)

模板
constexpr bool是_映射(const T&){return false;}
模板
constexpr bool是映射(const std::map&){
返回true;
}

您可以使用如下类型特征:

template< typename T >
struct is_map : std::false_type {};

template< typename Key, typename Value, typename Order, typename Allocator >
struct is_map< std::map< Key, Value, Order, Allocator > > : std::true_type {};

struct Foo
{
    std::map< int, float > m_map;
    int m_int;
};

static_assert(is_map< decltype(Foo().m_map) >::value);
static_assert(!is_map< decltype(Foo().m_int) >::value);
模板
结构是_映射:std::false_类型{};
模板
结构是_-map>:std::true_-type{};
结构Foo
{
标准::映射m_映射;
int m_int;
};
静态断言(is_map:value);
静态断言(!is_map:value);

您能展示一下您将使用哪些代码来利用此功能吗?有很多代码可以使用。您为什么需要这样做?你认为这样的检查能解决什么实际问题?请直接询问。如果您想要一个std::map特定的模板专门化,SFINAE或部分专门化将是一种方法@眠りネロク - 伟大的我匆忙地把它拼在一起,我知道我漏掉了一些箱子。现在我们必须等待问题被重新打开。函数有一个警告,它们可能会从不同的类型启动类型转换并给出错误的答案。再次抱歉,这些不是普通函数,而是函数模板。据我所知,在模板参数推导过程中从不考虑隐式用户定义转换。我错过了什么?谢谢。你说得对,
是映射(const T&)
重载将被选中。尽管如此,我还是倾向于保留类型特征版本,因为它不涉及模板参数推导和重载解析,直接对类型进行操作。好的,感谢您的澄清,这是一个非常有建设性的思考练习。也许您的方法可以适应更简单的用法(如
is\u map(var)
)。我在问题的末尾贴了一个这样的选项。