有很多方法可以实现has_type推导ifT的模板有一个名为type的嵌套类或typedef.即namespacedetail{templatestructtovoid{typedefvoidtype;};}templatestructhas_type:std::false_type{};//thisonewillonlybeselectedifC::typeisvalidtemplatestructhas_type::type>:std::true_type{};或者templatechartest_for_type(...){return'0';}templatedoubletes
假设我有一个整数类型T(有符号或无符号)。我想(在编译时)引用可以容纳的最小整数类型(有符号或无符号),比如说std::numeric_limits::max()加1(在非溢出意义上,我的意思是)。这样做的通用方法是什么? 最佳答案 对于无符号类型,这可以解决问题:templateconstexprunsignedsize_in_bits(){returnsizeof(T)*CHAR_BIT;}templateusingleast_larger_uint_t=typenameboost::uint_t()+1>::least;如果我
MSVC10和MSVC9在编译我的异常框架时都生成了4级警告消息,尽管程序的行为似乎是正确的。异常框架相当庞大和复杂,但我已经设法将其归结为它的本质。这是一个完整的程序,您可以在VS10中编译和运行#include#include#include#include#includeusingnamespacestd;namespaceex{classgeneric_error:virtualpublicstd::exception{public:generic_error(intthread_id):thread_id_(thread_id){}constchar*what()constt
当使用带有pImpl习惯用法的智能指针时,如structFoo{private:structImpl;boost::scoped_ptrpImpl;};明显的问题是Foo::Impl在生成Foo的析构函数时不完整。编译器通常会在那里发出警告,而Boost智能指针内部使用的boost::checked_delete静态断言类Foo::Impl已完成如果不是这种情况,则触发错误。要编译上面的例子,必须这样写structFoo{~Foo();private:structImpl;boost::scoped_ptrpImpl;};并在实现文件中实现一个空的Foo::~Foo,其中Foo::Im
这个问题不太可能帮助任何future的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visitthehelpcenter.关闭10年前。我似乎在下面的代码段中遇到了一个特殊的错误(忽略多余的头文件和空白的主函数,我只是想将这个问题隔离到一个可编译的.cpp文件中以便在这里发布)。它说从“[我定义的某些类型]”到非标量类型“[我定义的某些类型]”的错误转换。这个特定示例中的代码应该将一组字符串列表作为一个输入参数(命名输入),并将对字符串列表的引用作为另一个(命名输出)并计算最长的公共(p
Previousquestion.我重复上一个问题的代码,使这个问题独立。如果使用gcc4.8.3编译下面的代码,则它不会发出任何警告。使用-std=c++1y。但是,如果使用-std=c++0x标志编译,它会发出警告。在上一个问题的上下文中,声明代码不使用gcc4.9.0编译。不幸的是,目前我还没有完全理解auto是如何实现的。因此,如果有人能回答以下问题,我将不胜感激:1).以下代码是否符合C++14标准的有效C++?2).如果是的话,这段代码会被认为是一种好的风格吗?如果不是,为什么不呢?3).为什么下面的代码在使用C++11编译器时(有时)可以编译和工作?或者,为什么它并不总是
例如,考虑header。C++标准says:TheheaderdefinesalltypesandmacrosthesameastheCstandardlibraryheader.那么有没有必要用saystd::int8_t而不是短C形式int8_t在什么地方? 最佳答案 Soisthereaneedtousesaystd::int8_tinsteadoftheshortCformint8_tsomewhere?是的。每[headers]/4C名称是否在全局namespace中定义是未指定的。因此你需要std::int8_t使用in
#includeclassB;classA{inta;public:friendvoidB::frndA();};classB{intb;public:voidfrndA();};voidB::frndA(){Aobj;std::cout尝试编译这段代码时,出现了一些错误。例如invaliduseofincompletetype这段代码有什么问题? 最佳答案 将整个classB...声明放在classA之前。您还没有声明B::frndA();。#includeusingnamespacestd;classB{intb;public:
我有这个(不是真的,只是一个简单的例子):templateTfoo(){...}我需要检查函数的结果类型(这里没有任何意义,我保证我的例子更复杂),googletest/mock是否支持这种断言?我用A尝试EXPECT_THAT,但我做不到。谢谢。 最佳答案 GoogleTest用于运行时测试。函数的类型是在编译时确定的,在GoogleTest进入画面之前。您可以使用result_of并断言typeid值相同,如下所示:EXPECT_EQ(typeid(int),typeid(std::result_of()>::type));另一
我即将开始一个连接两个程序的项目,一个用c#,一个用c++。我已经有一个可以工作的c#程序,它能够与自身的其他版本对话。在开始使用c++版本之前,我想到了一些问题:1)我正在使用protobuf-netv1。我认为序列化程序中的.proto文件正是C++版本模板所需要的?谷歌搜索提到了有关Pascal大小写的内容,但我不知道这是否重要。2)如果其中一种.NET类型在C++中没有直接对应项,我该怎么办?如果我有小数或字典怎么办?我是否必须以某种方式修改.proto文件并将数据压缩成不同的形状?(我会检查文件,看看我能不能弄明白)3)人们还能想到其他陷阱吗?二进制格式之类的?编辑我已经看过