草庐IT

Metaprogramming

全部标签

c++ - 字符串相等的编译时断言

这可以使用模板吗?有两个字符串常量。它们来自不同模块中的定义。它们必须相等,否则如果它们不相等,我将引发编译时错误。我可以使用模板吗?#defineMY_STRING"foo"CompileAssertIfStringsNotEqual(MY_STRING,HIS_STRING);附:假设“abc”[0]是常量表达式,我被迷惑了。它不是。语言中的奇怪遗漏。如果“abc”[0]是常量表达式,那将是可能的。 最佳答案 这仅适用于C++0x。C++03没有机会。编辑:C++0x的Consexpr函数。以下内容适用于GCC4.6,但标准并未

c++ - 字符串相等的编译时断言

这可以使用模板吗?有两个字符串常量。它们来自不同模块中的定义。它们必须相等,否则如果它们不相等,我将引发编译时错误。我可以使用模板吗?#defineMY_STRING"foo"CompileAssertIfStringsNotEqual(MY_STRING,HIS_STRING);附:假设“abc”[0]是常量表达式,我被迷惑了。它不是。语言中的奇怪遗漏。如果“abc”[0]是常量表达式,那将是可能的。 最佳答案 这仅适用于C++0x。C++03没有机会。编辑:C++0x的Consexpr函数。以下内容适用于GCC4.6,但标准并未

c++ - 为什么使用两个 sizeof 来检查一个类是否是默认可构造的,而一个却不行?

我使用了“IsthereawaytotestwhetheraC++classhasadefaultconstructor(otherthancompiler-providedtypetraits)?”中的代码。我稍作修改以适用于我的所有测试用例:templateclassis_default_constructible{typedefintyes;typedefcharno;//thesecondversiondoesnotwork#if1templateclassis_equal{};templateclassis_equal{typedefvoidtype;};templatest

c++ - 为什么使用两个 sizeof 来检查一个类是否是默认可构造的,而一个却不行?

我使用了“IsthereawaytotestwhetheraC++classhasadefaultconstructor(otherthancompiler-providedtypetraits)?”中的代码。我稍作修改以适用于我的所有测试用例:templateclassis_default_constructible{typedefintyes;typedefcharno;//thesecondversiondoesnotwork#if1templateclassis_equal{};templateclassis_equal{typedefvoidtype;};templatest

c++ - 从 C++ (STL) 中的(它的)迭代器类型获取容器类型

给定一个容器很容易获得相关的迭代器,例如:std::vector::iteratori;//Aniteratortoastd::vector我想知道在给定迭代器类型的情况下是否有可能推断出“相应容器”的类型(这里我假设每个容器只有一个(非const)迭代器)。更准确地说,我想要一个适用于所有STL容器的模板元函数(无需为每个容器手动专门化它),例如:ContainerOf::iterator>::type计算为std::vector有可能吗?如果不是,为什么?提前感谢您的帮助! 最佳答案 我认为这是不可能的。在某些STL库中,您实际

c++ - 从 C++ (STL) 中的(它的)迭代器类型获取容器类型

给定一个容器很容易获得相关的迭代器,例如:std::vector::iteratori;//Aniteratortoastd::vector我想知道在给定迭代器类型的情况下是否有可能推断出“相应容器”的类型(这里我假设每个容器只有一个(非const)迭代器)。更准确地说,我想要一个适用于所有STL容器的模板元函数(无需为每个容器手动专门化它),例如:ContainerOf::iterator>::type计算为std::vector有可能吗?如果不是,为什么?提前感谢您的帮助! 最佳答案 我认为这是不可能的。在某些STL库中,您实际

c++ - 防止非常量左值解析为右值引用而不是 const 左值引用

我在重载一个函数以通过const引用获取一个值时遇到问题,或者,如果它是一个右值,一个右值引用。问题是我的非常量左值绑定(bind)到函数的右值版本。我在VC2010中这样做。#include#includeusingnamespacestd;templatevoidfoo(constT&t){coutvoidfoo(T&&t){coutx;foo(x);//voidfoo(T&&)?????foo(vector());//voidfoo(T&&)}优先级似乎是推断foo(x)为foo&>(vector&&&t)而不是foo>(constvector&t)我尝试将右值引用版本替换为vo

c++ - 防止非常量左值解析为右值引用而不是 const 左值引用

我在重载一个函数以通过const引用获取一个值时遇到问题,或者,如果它是一个右值,一个右值引用。问题是我的非常量左值绑定(bind)到函数的右值版本。我在VC2010中这样做。#include#includeusingnamespacestd;templatevoidfoo(constT&t){coutvoidfoo(T&&t){coutx;foo(x);//voidfoo(T&&)?????foo(vector());//voidfoo(T&&)}优先级似乎是推断foo(x)为foo&>(vector&&&t)而不是foo>(constvector&t)我尝试将右值引用版本替换为vo

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?