例如,具有C99标准的C编程语言支持十六进制浮点文字,但C++与C++ 03标准不支持.
我对它进行了测试,GCC在C++ 03模式下识别了十六进制浮动文字(-std = c ++ 03),但根据C++标准,它不应该.我知道,这不是一个悲剧,我只是对这个问题感兴趣..
GCC编制器是否符合标准?你能推荐我一个符合标准"完美"的C/C++编译器吗?
template <class T>
class Foo {
public:
T val;
Foo(T _v): val(_v){}
friend ostream& operator<< (ostream& out, const Foo& A) {
out << A.val;
return out;
}
};
template <class X, class Y> Foo<???> operator+(const Foo<X>& A, const Foo<Y> & B) {
if (sizeof(X) > sizeof (Y))
return Foo<X>(A.val + B.val);
else
return Foo<Y>(A.val + B.val);
}
int main() {
Foo<double> a(1.5);
Foo<int> b(2);
cout << a << endl;
cout << b << endl;
cout << a+b << endl;
} …Run Code Online (Sandbox Code Playgroud) 如果我有这样的容器....
std::map <std::string, IHaveAReallyExpensiveConstructor_t>
Run Code Online (Sandbox Code Playgroud)
我保证IHaveAReallyExpensiveConstructor_t()只有在地图中创建一个新元素时才会调用构造函数,比如说std::map::operator[]?
如果重要,只有默认构造很难.复制结构很便宜,而不是真正的问题.
为了简化在C++中编写SQL查询,我使用宏
#define SQL(...) #__VA_ARGS__
Run Code Online (Sandbox Code Playgroud)
它工作正常,除非出现空字符串文字(类似于
SQL(select * from foo where bar = '')
Run Code Online (Sandbox Code Playgroud)
),clang(没有其他编译器)发出警告
warning: empty character constant [-Winvalid-pp-token]
Run Code Online (Sandbox Code Playgroud)
我正在做一个严重的黑客(我仍然保持,因为它允许多行sql语句可读)违反标准或在这里过于关键(字符文字没有出现在预处理器指令中)?
编辑:忘记提及并非所有平台都支持C++ 11,因此我们不能使用原始字符串文字.我们可能会坚持使用VisualC++ 9.0多年,而Gcc 4.6-somesnapshot可能更少,但仍然是几年.黑客攻击也早于C++ 11.
我正在尝试更新一些C++代码,我想转向更现代的代码(c ++ 11),但我仍然需要使用一些较旧的编译器(符合c ++ 03)编译代码,因为支持的平台约束.
我知道在C++ 11编译器中不推荐使用std :: auto_ptr,但由于编译器支持较旧,我不能只用std :: unique_ptr替换它们.
有没有一个很好的做法来处理这个"旧的编译器支持,但是开始转向C++ 11"?
我确实理解为什么有时建议为swap()给定的类实现我们自己的函数。
例如,如果我们有一个遵循pimpl习惯用法的类,我们可能希望定义自己的复制构造函数,以便它执行作为参数传递的对象内容的深层复制,而不是由默认的复制构造函数。这同样适用于复制赋值运算符。
因为它似乎是通过复制构造函数和复制赋值std::swap()运算符(至少在 C++03 中)实现的。对要交换的对象执行深拷贝是低效的,因为只需要交换这些对象所包含的指针。
我的问题是为什么我们应该将我们的swap()函数实现为非抛出函数。
在上面解释的情况下,我认为这只是关于语义:因为没有分配新资源(即:只是交换两个现有指针)。对于这样一种函数来说,抛出异常没有多大意义。
然而,在这个推理中我可能忽略了其他原因或场景。
我注意到,使用时:
std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();
Run Code Online (Sandbox Code Playgroud)
mystd::vector<int>未序列化为原始字节数据(每个 4 个字节)int),而是序列化为字符串,即每个整数的字符串表示形式保存到磁盘,这是我不想要的。
如何保存std::vector<int>为二进制数据?
(注意:在学习新方法之前,我想用标准 C++03 来学习它)。
编写一个接口,我必须将 的实例转换std::vector<double>为boost::array<double,N>. 每次,通过构造(没有错误),我确定向量具有正确的大小。
这是我目前正在做的一个例子(我有大约 100 个这样的函数要写在界面中):
double foo1(const std::vector<double>& x)
{
assert(x.size() == 4);
boost::array<double,4> x_;
for(std::size_t i = 0; i < 4; ++i)
x_[i] = x[i];
return foo1_(x_);
}
double foo2(const std::vector<double>& x)
{
assert(x.size() == 6);
boost::array<double,6> x_;
for(std::size_t i = 0; i < 6; ++i)
x_[i] = x[i];
return foo2_(x_);
}
Run Code Online (Sandbox Code Playgroud)
有没有更短的方法来做到这一点?
注 1:出于兼容性原因,我不使用 C++11。
注 2:我添加了标签,stdarray因为即使它是 C++11 标签,它也可能有所帮助。
我一直在阅读and boost::function,但是,如果所有参数都被绑定,boost::bind我似乎无法找出调用函数的“好方法” (我认为这是正确的术语)。boost下面是未经测试的 MCVE(复制粘贴我的真实代码并不理想)。
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <iostream>
void func(void* args)
{
int* myInt = static_cast<int*>(args);
if (myInt != NULL)
{
std::cout << "myInt = " << *myInt << std::endl;
}
else
{
std::cout << "args is NULL" << std::endl;
}
}
int main()
{
int myInt1 = 5;
int myInt2 = 45;
boost::function<void(void* args)> myFunc = boost::bind(&func, &myInt1);
// here's my problem,, how do I call myFunc?
myFunc(); // this …Run Code Online (Sandbox Code Playgroud) B使用 C++98(或 C++03),如何定义类 ( ),使得不能从D派生自 的类 ( )实例化任何对象B。
struct B {};
struct D : public B {};
D d; // this should result in a compiler error
Run Code Online (Sandbox Code Playgroud)
在 C++11(或更新版本)中,可以使用final说明符。