草庐IT

typetraits

全部标签

C++ 惯用类型特征

我有一个驻留在命名空间中的类型特征系统,如下所示:namespacemy_namespace{templatestructmagic_traits{staticconstintvalue=0;};}因为人们讨厌模板特化的语法,所以我有这个方便的小宏:#defineDECLARE_MY_MAGIC_TRAITS(type_,value_)\namespacemy_namespace\{\template\structmagic_traits{\staticconstintvalue=value_;\};\}}我的问题是这只适用于全局命名空间中的声明,因此其他命名空间中类型的特征如下所示:

c++ - 检查类型是否为 map

我有时发现需要编写可应用于对象容器或此类容器的映射(即处理映射中的每个容器)的通用例程。一种方法是为map类型编写单独的例程,但我认为使用一个适用于两种输入类型的例程会更自然、更简洁:templateautofoo(constT&items){returnfoo(items,/*tagdispatchtomapornon-map*/);}执行此标记分派(dispatch)的安全、干净的方法是什么? 最佳答案 现有答案针对std::map的非常具体的属性进行测试,或者它恰好是std::map的特化(这对于std::unordered_

c++ - 为什么 std::is_assignable 违反直觉?

std::is_assignable::value==false在一致的实现中(例如clang/libc++、gcc/libstdc++,但不是VS2012)。直觉上,这意味着像intx=3;这样的表达式是无效的。但是is_assignable的规范指出分配的两边都转换为std::add_rvalue_reference::type,等等std::is_assignable::value必须评估为false(因为int+&&->int&&,这是一个不可分配的右值)。为什么是std::is_assignable以这种方式设计,还是我误解了什么is_assignable::value真的是

在 T1 和 T2 之间选择的 C++ 类型特征

我想要一个模板来根据某些条件从两种类型中进行选择。例如structBase{};templatestructtest{//e.g.hereitshouldselectT1/T2thatis_base_oftypenameselect_base::typem_ValueOfBaseType;};当然,将条件传递给select_base(使其通用)会很有用,但硬编码解决方案更容易也更好。这是我尝试过的示例解决方案,但它始终选择T1:http://ideone.com/EnVT8问题是如何实现select_base模板。 最佳答案 如果您

c++ - 如何找出一个类型是否具有任何返回类型的成员函数?

我需要确定给定类型是否具有函数X作为具有给定参数列表的可调用函数。但是,检查应该不关心返回值。我找到了thissolution来自anotherStackOverflowquestion这似乎运作良好。它的作用是这样的:#includetemplatestructis_call_possible:publicstd::false_type{};templatestructis_call_possible::value||std::is_convertible().operator()(std::declval()...)),R>::value>::type>:publicstd::tr

c++ - 如何找出一个类型是否具有任何返回类型的成员函数?

我需要确定给定类型是否具有函数X作为具有给定参数列表的可调用函数。但是,检查应该不关心返回值。我找到了thissolution来自anotherStackOverflowquestion这似乎运作良好。它的作用是这样的:#includetemplatestructis_call_possible:publicstd::false_type{};templatestructis_call_possible::value||std::is_convertible().operator()(std::declval()...)),R>::value>::type>:publicstd::tr

c++ - 在编译时检测 typedef(模板元编程)

我目前正在做一些模板元编程。就我而言,我可以处理任何“可迭代”类型,即typedeffooconst_iterator以相同方式存在的任何类型。我试图为此使用新的C++11模板元编程,但是我找不到检测某个类型是否丢失的方法。因为我还需要根据其他特征打开/关闭其他模板特化,所以我目前正在使用带有两个参数的模板,第二个是通过std::enable_if生成的。这是我目前正在做的事情:templatestructFoo{};//defaultcaseisinvalidtemplatestructFoo::value>::type>{voiddo_stuff(){...}};templates

c++ - 在编译时检测 typedef(模板元编程)

我目前正在做一些模板元编程。就我而言,我可以处理任何“可迭代”类型,即typedeffooconst_iterator以相同方式存在的任何类型。我试图为此使用新的C++11模板元编程,但是我找不到检测某个类型是否丢失的方法。因为我还需要根据其他特征打开/关闭其他模板特化,所以我目前正在使用带有两个参数的模板,第二个是通过std::enable_if生成的。这是我目前正在做的事情:templatestructFoo{};//defaultcaseisinvalidtemplatestructFoo::value>::type>{voiddo_stuff(){...}};templates

c++ - "std::is_callable"在 C++17 中被 "std::is_invocable"替换了吗?

cppref已删除std::is_callable的入口页面,并使用std::is_invocable而是进入页面。但是,std::is_callable在VisualStudio2017中仍然可用。是std::is_callable正式[replaced|deprecated|removed]为std::is_invocable在C++17中? 最佳答案 是的,is_callable已重命名为is_invocable,如p0604r0中所述.该文件包括此决定的理由:Renameis_callabletois_invocable:i

c++ - "std::is_callable"在 C++17 中被 "std::is_invocable"替换了吗?

cppref已删除std::is_callable的入口页面,并使用std::is_invocable而是进入页面。但是,std::is_callable在VisualStudio2017中仍然可用。是std::is_callable正式[replaced|deprecated|removed]为std::is_invocable在C++17中? 最佳答案 是的,is_callable已重命名为is_invocable,如p0604r0中所述.该文件包括此决定的理由:Renameis_callabletois_invocable:i