类型特征是语法扩展,允许开发人员在编译时确定类型的各种特征。 C ++支持由编译器支持和一组库模板的组合提供。通过标题<type_traits>提供对类型特征的访问
std::vector<std::aligned_storage> 是病态的吗?
address sanitizer 变得疯狂: 有时放置 new ::new(&vec[some_index]) T(std::forw...
C++17 如何使用变量模板模仿Julia的'promote_type'函数?
由于一些个人原因,我正在开发Julia的SparseMatrixCSC的C++版本,这个版本在我移植到C++的项目中很特殊,Armadillo的SpMat未能成为一个完美的替代品......。
为什么 std::arrays 会破坏带有类型检查的模板函数?
我有一个模板函数,根据所提供的类型执行某些操作:模板 T read() { if (std::is_integral) ()) {返回 static_cast
我正在为一个结构的友函数而苦恼,这个结构的模板参数为enable_if。/ foo.h #ifndef FOO_H #define FOO_H #include template< typename T, ...
我很难在编译时检查类型是否是std::bitset。我想用类似于:is_bitset的方法来实现。 &gt;::value; /应该计算为真。 ...
我做了一个函数,按成员对我的向量进行排序(比如按年龄或姓名对学生进行排序),所以我做了一个模板函数template 无效排序(向量 & ...
我正试图用当前的GCC10更新一些旧的代码到即将到来的C++20语言中。我无法更新一些模板,因为它们使用了一个std::enable_if--------。 > ...
我需要在模板类里面有条件的使用std::abs或者std::fabs,下面是简化版的相关代码:模板类。 class C { public: using type = std::...
std::is_base_of的唯一区别在于,它是一个类的内部实现。 和 std::is_convertible 当Base是一个私有或受保护的基地时,前者也是真实的......。
我正试图写一个类型特征来检测一个类型是否具有某个类型的T::type。我使用的是这个答案中的代码。作为参考,这是我正在使用的部分代码。/ 参见http:/www.open-...
我正试图写一个类型特征来检测一个类型是否具有某个类型的T::type。我使用的是这个答案中的代码。作为参考,这是我正在使用的部分代码。/ 参见http:/www.open-...
如果 std::is_standard_layout_v<T> 为真,那么 std::is_trivial_v<T> 是否总是为真?
模板 void f() { 如果 constexpr (std::is_trivial_v) ) { / 下面这行是否从来没有失败过? static_assert(std::is_standard_layout_v)。 ); ...
有一个虚拟类C,我想确保任何继承自C的具体子类都能实现一个函数 "get"(如果没有的话,会有一个明确的编译时错误)增加一个虚拟的"......"。
我想通过使用enable_if_t根据类型更改函数定义。与此类似的东西:#include template struct A;模板
我想更好地了解std :: decay的工作原理。根据cppreference,它应该从类型中删除const和volatile分类,作为它进行其他转换的一部分。 ...
问题可能很奇怪,所以这里是一个简短的激励示例:#include #include template // gcc 8.3的变通方法,其中volatile int不是...
[必需是类型T的类型特征,如果T具有typedef value_type,则提供类型为T :: value_type的typedef类型,否则为T。我已经尝试了以下实现,但没有实现...
我想定义一个接受所有可调用对象的概念。到目前为止,这是我所做的:template 概念Func = std :: is_function_v
我想写一个类型特征来标识增强型多精度整数类型。我可以针对uint256_t这样的具体类型执行此操作:template struct is_multiprecision_int:std :: ...
为什么std :: arrays通过类型检查破坏模板化函数?
我有一个模板函数,该函数根据提供的类型执行某些操作:template T read(){如果(std :: is_integral ()){return static_cast > read是模板。每次实例化此模板时,编译器都会生成函数的整个主体。当您调用read<int>()时,也会编译带有array的段,但是无法将数组分配给返回类型int。这就是为什么您得到错误。 在g ++ 7.3下,您可以使用if constexpr构造。这样,仅编译if 条件为true的范围内的行: template<typename T> T read() { if constexpr (std::is_integral<T>()) { return static_cast<T>(std::stoi(readToken())); } else if constexpr (std::is_same<T, float>()) { return std::stof(readToken()); } else if constexpr (std::is_same<T, std::array<float, 3>>()) { std::array<float, 3> arr; arr.at(0) = 4; arr.at(1) = 2; arr.at(2) = 0; return arr; } else throw std::logic_error("Invalid type"); } 在c ++ 17之前,您调用helper函数,该函数对于您要处理的所有类型都是重载的: template<class T> T readHelper() { throw std::runtime_error("invalid type"); } // here provide types you want to be handled template<> int readHelper<int>() { return std::stoi(readToken()); } template<> float readHelper<float>() { return std::stof(readToken()); } template<> std::array<float,3> readHelper<std::array<float,3>>() { return std::array<float,3>{}; } template<class T> T read2(){ return readHelper<T>(); } Demo