is_base_of "如何工作?
以下代码如何工作? typedef char (&yes)[1]; typedef char (&no)[2]; template struct Host { operator B*() const; operator D*(); }; template struct is_base_of { template static yes check(D*, T); static no check(B*, int); static const bool value = sizeof(check(Host(), int())) == sizeof(yes); }; //Test sample class Base {}; class Derived : private Base {}; //Expression is t
10 2023-05-15
编程技术问答社区
C++11模板的is_same类型特质
是否可以检查该类型T是任意类型和大小的std::array? 我可以检查一个特定的数组,例如: is_same>::value 但是我想检查T是std::array的任何实例化.如下(当然,没有编译): is_same::value 有没有办法实现此目标(也许不使用is_same)? 解决方案 您必须写自己的书,但很简单: template struct is_std_array : std::false_type {}; template struct is_std_array> : std::true_type {};
4 2023-03-26
编程技术问答社区
是否有办法使用c++类型特征来检查一个类型是否是模板以及其中的任何属性?
我希望能够推断给定类型是否为模板类型.我浏览了Boost的类型特征类,但是找不到与模板相关的IS_*特征: 更有趣的是,是否有一些编译时间来确定模板参数的属性,例如多少个模板参数或参数是模板模板参数. 解决方案 这是一个部分解决方案: #include #include template struct is_template : std::false_type {}; template class Tmpl, typename ...Args> struct is_template> : std::true_type {}; template struct Foo {}; int main() { std::cout ::value
60 2023-03-01
编程技术问答社区
如何判断模板类型是否是模板类的实例?
我有一个函数,该函数采用模板类型来确定返回值.是否有任何方法可以在编译时间告诉模板类型是否是模板类的某些实例化? ex. class First { /* ... */ }; template class Second { /* ... */ }; using MyType = boost::variant, Second>; template auto func() -> MyType { static_assert(/* what goes here?? */, "func() expects Second type"); SecondType obj; // ... return obj; } MyType obj = func>(); 我知道可以通过做 来解决这个问题 temp
66 2023-02-24
编程技术问答社区
检查一个变量类型是否是可迭代的?
有什么方法可以检查任意变量类型是否是迭代的? 因此,要检查它是否具有索引元素,或者我实际上可以循环浏览其孩子? (例如使用foreach?) 是否可以为此创建通用模板? 在搜索它时,我已经找到了其他编程语言的技术.然而,仍然必须找出如何在C ++中做到这一点. 解决方案 这取决于您所说的"迭代".这是C ++的一个松散概念,因为您可以以许多不同的方式实现迭代器. 如果您是指基于C ++ 11的基于循环的范围,则该类型需要begin()和end()要定义的方法并返回响应operator!=, operator++和operator*. 如果您是指BOOST的BOOST_FOREARCE助手可扩展性. 如果在您的设计中,您都有所有可触及的容器都继承的通用接口,则可以使用C ++ 11的 std :: is_base_of : struct A : IterableInterface {} struct B {} template
14 2023-02-23
编程技术问答社区
static_assert内/外类定义
为什么 static_assert 需要在类定义之外? 失败代码 #include class A { public: A(A&&) noexcept {} static_assert(std::is_nothrow_move_constructible::value, "ERROR"); }; int main() { } 工作代码 #include class A { public: A(A&&) noexcept {} }; static_assert(std::is_nothrow_move_constructible::value, "ERROR"); int main() { } 什么时候适合在类或结构的定义中使用 static_asserts? 解决方案 就 static_assert 本身的位置而言,您的代码的两个版本都是有效的.所以,不, s
64 2022-08-22
编程技术问答社区
在编译时验证对象是否被创建为shared_ptr
我编写了一些类(通常作为 boost::asio 的一部分),其对象依赖于包装在 shared_ptr 中,因为它们使用 shared_from_this().如果对象没有在 shared_ptr 中实例化,有没有办法防止对象被编译? 那么,我在寻找什么: std::shared_ptr a = std::make_shared(); // should compile fine std::unique_ptr a = std::make_unique(); // compile error MyClass a; // compile error 解决方案 将它的构造函数设为私有,并给它一个静态工厂成员函数来创建一个shared_ptr.不要忘记在评论中记录您的设计决定! // Thing that foos the bar struct Foo : std::enable_shared_from_t
66 2022-08-21
编程技术问答社区
编写在定义了 "has_trivial_destructor "而不是 "is_trivially_destructible "时能工作的代码
在C++11标准的细化过程中,似乎is_trivially_destructible 被认为是比 更好/更一致的名称has_trivial_destructor. 这是一个相对较新的开发,因为我的 g++ 4.7.1 仍然使用旧名称,并且已修复以符合 4.8 的标准: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52702 我一直在懒惰地使用 #if,它有利于我正在使用的编译器: #if TRIVIAL_DESTRUCTOR_TYPE_TRAIT_MATCHES_STANDARD template using is_trivially_destructible = std::is_trivially_destructible; #else template using is_trivially_destructible = std::has_trivial_destructor
1550 2022-07-19
编程技术问答社区
检查对象是否声明为常量
如果对象被声明为const,我想打破编译。 以下不工作: #include struct A { A():v(0) { static_assert(!std :: is_const(v)。 } int v; }; int main() { A a1; // ok,这个编译 const A a2; // no,this break the compilation a1.AccessValue()= 5; // ok a2.AccessValue()= 6; // OPS } 因此,有一种方法可以打破编译 $ 解决方案 这
232 2022-07-19
编程技术问答社区
为什么没有std::is_struct类型特质?
我已经看到为了检查类型 T 是否是我可以使用的类 bool isClass = std::is_class::value; 它对类和结构都返回 true.我知道在 C++ 中它们几乎是一回事,但我想知道为什么它们在类型特征上没有区别.查这个区别总是没用,还是还有什么我不明白的原因? 解决方案 它对类和结构都返回 true.我知道在 C++ 中它们几乎是一回事,但我想知道为什么它们在类型特征上没有区别. 不幸的是,这是 C++ 中的一个常见误解.有时它来自基本的误解,但有时它来自英语的歧义.它可能来自不准确的编译器诊断、写得不好的书籍、不正确的 SO 答案… 你可能读过这样的文章: “除了成员和基的默认可见性之外,结构和类在 C++ 中没有区别." 这段话可能会被误解,因为在使用“没有区别"之类的短语时,很难区分 identity 和 equality 的概念. 事实上,C++ 自 1985 年以来就没有结构.它只有类. 您使用关
208 2022-07-19
编程技术问答社区
C++1z | 检查在变量模板参数包中是否传递了一个类型
我在某处听说过,使用新的 C++1z 语法,很容易检查是否在可变参数模板参数包中传递了一个类型——显然你可以使用接近一行的代码来做到这一点.这是真的?这些相关的特征是什么?(我尝试查看折叠表达式,但看不到如何在该问题中使用它们...) 以下是我在 C++11 中解决问题的方法以供参考: #include template struct contains; template struct contains { static constexpr bool value = false; }; template struct contains { static constexpr bool value = std::is_same
264 2022-07-19
编程技术问答社区
找出一个C++对象是否可调用
是否可以编写类型特征,例如 is_callable 来判断对象是否定义了 operator()?如果事先知道调用运算符的参数很容易,但不是在一般情况下.当且仅当至少定义了一个重载调用运算符时,我希望特征返回 true. 这个问题是相关的并且有一个很好的答案,但它不适用于所有类型(仅 int 可转换).此外,std::is_function 有效,但仅适用于实际函数而不是仿函数,我正在寻找更通用的解决方案. 解决方案 我认为这个 trait 可以满足你的需求.它检测具有任何类型签名的 operator() ,即使它已重载并且是否已模板化: template struct is_callable { private: typedef char(&yes)[1]; typedef char(&no)[2]; struct Fallback { void operator()(); }; struct Derived
152 2022-07-19
编程技术问答社区
关于is_copy_constructible的问题
类型特征是否应该能够处理诸如 std::vector > 之类的情况并检测到它不是可复制构造的? 这是 https://ideone.com/gbcRUa 的示例(运行 g++ 4.8.1) #include #include #include #include int main() { // This prints 1, implying that it's copy constructible, when it's clearly not std::cout > >::value
550 2022-07-17
编程技术问答社区