C++ IO流的基类std::basic_ios定义operator void*()为返回!fail()和operator!()返回fail().这让我想知道为什么我们需要它operator!().当然,!is也可以通过隐式调用operator void*()和否定其结果来工作.
我在这里遗漏了什么,还是纯粹出于历史原因而std::basic_ios::operator!()定义的?
一个在comp.lang.c ++的问题.主持并没有带来任何答案要么.
我想知道我的代码的哪一部分将在不再需要时释放动态分配的静态类成员.请参阅以下代码:classPrinter在所有A对象之间共享,并在创建第一个类实例时A创建.只是为了确定:classPrinter退出程序时对象会自动被破坏,对吧?
啊
class A {
static B* classPrinter;
}
Run Code Online (Sandbox Code Playgroud)
a.cpp
#include "a.h"
B A::classPrinter = new B();
A::A() { ...}
Run Code Online (Sandbox Code Playgroud) 是否可以定义两个具有相同名称的不同模板(按模板参数数量)?
这是我想要做的:
namespace MyNamespace
{
template<class TRet>
class FunctionObject
{
typedef typename TRet ReturnType;
virtual ReturnType const operator()() const = 0;
};
template<class TRet, class TArg0>
class FunctionObject
{
typedef typename TRet ReturnType;
typedef typename TArg0 FirstArgumentType;
virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
};
}
Run Code Online (Sandbox Code Playgroud)
我在第二个FunctionObject结构定义的右括号末尾提到了太多模板参数的错误.
我知道这可以在C#中完成,但对C++不确定.有人可以在这里说清楚吗?
我这里有一个通用状态机的专有实现,它使用std::tr1::tuple一个转换表作为转换表:
template<State StartState, Event TriggerEvent, State TargetState>
struct transition {...};
typedef std::tr1::tuple< transition< ready , run , running >
, transition< running , terminate, terminating >
, transition< terminating, finish , terminated >
> transition_table;
Run Code Online (Sandbox Code Playgroud)
有一个功能
template<typename Transitions>
State find_next_state( State current
, Event event
, const Transitions& transition_table );
Run Code Online (Sandbox Code Playgroud)
在给定当前状态和事件的情况下查找转换表中的下一个状态.
这一切都很好,除了这个平台的tuple实现不支持10个以上的项目.这似乎也是如此boost::tuple,所以我试图改为使用boost::fusion::vector.但似乎融合find_if仅采用"一元MPL Lambda表达式 " - 我想这只能在编译时使用.
所以鉴于上述情况,我该如何实施find_next_state()?
注意:
这是一个专有的嵌入式平台,仅提供GCC 4.1.2,因此我们坚持使用C++ 03 + TR1.
该网站声明" 所有权,来源和汇 ":
"当你复制一个auto_ptr,你自动将所有权从源转移auto_ptr到目标auto_ptr; 如果目标auto_ptr已经拥有一个对象,那么该对象首先被释放.在复制之后,只有目标auto_ptr拥有指针并在适当的时候删除它,而源被设置回null状态,不能再用于引用拥有的对象."
现在考虑的定义operator=()为templacte<classX> class auto_ptr,在Stroustrup的第14章,368页的C++编程语言第三版:
auto_ptr& operator=(auto_ptr& a) throw() { ptr = a.ptr; a.ptr = 0; }
我无法看到操作员释放所解决的对象ptr,万一ptr != 0!
我想知道为什么STL的地图是基于rb树的?我的意思是,基于散列的映射似乎在插入/删除甚至获取值方面更有效.有什么具体考虑吗?
所以我知道在C++常量中,默认情况下获得的变量与变量不同.这就是我不能放的原因
int foo;
Run Code Online (Sandbox Code Playgroud)
在一些标题中 - 链接器会正确地抱怨多个定义.OTOH,我可以写
const int bar = 42;
Run Code Online (Sandbox Code Playgroud)
在标题中,编译器确保只有一个定义bar.
使用积分常量,很容易看出编译器如何处理这个 - 至少只要没有人获取地址bar或做一些其他有趣的事情,需要它为它分配存储).但是,如果有人怎么办?如果它不是一个整体但需要在运行时执行的代码呢?假设我将其放入标题中:
const std::string baz = "h2g2";
Run Code Online (Sandbox Code Playgroud)
假设没有小的字符串优化,这需要在运行时分配动态内存,因此需要执行代码,地址需要存储在某处,等等.
我假设我最终会得到baz每个翻译单元的一个定义,只是编译器为其分配内部链接以防止链接器抱怨?或者我错过了什么?
注意:我对constexpr普通的旧C++常量不感兴趣,因为它们自80年代以来就存在并且在C++ 98中编纂.(但是,如果一个全面的答案将包括这一切如何融合在一起constexpr,我不会抱怨.)
在大约十年前的一个项目中,我们发现std::vector动态分配导致了严重的性能损失.在这种情况下,它分配了许多小向量,因此快速解决方案是编写一个类似于向量的类,包装在基于堆栈的预分配char数组中,用作其容量的原始存储.结果是static_vector<typename T, std::size_t Max>.如果您了解一些基础知识,这样的事情很容易写,你可以在网上找到很多这样的野兽.事实上,现在也有一个提升.
现在在嵌入式平台上工作,我们碰巧需要一个static_basic_string.这将是一个字符串,它预先在堆栈上分配固定的最大内存量,并将其用作容量.
起初我认为这应该相当容易(static_vector毕竟它可以基于现有的),但再看看std::basic_string界面我不再那么肯定了.它比std::vector界面更复杂.特别是实现find()功能系列std::basic_string不仅仅是一项繁琐的工作.
这让我再次思考.毕竟,这就是创建分配器的原因:基于new和delete使用其他方法替换分配.但是,要说分配器接口不实用将是轻描淡写.有一些文章在那里解释它,但有一个原因,我在过去的15年中看到这么少的本土分配器.
所以这是我的问题:
如果你必须实现一个basic_string相似的,你会怎么做?
static_basic_string?std::basic_string?与往常一样,对我们来说存在相当重要的限制:在嵌入式平台上,我们与GCC 4.1.2绑定,因此我们只能使用C++ 03,TR1和boost 1.52.
我知道这已被问过很多,但我能找到的唯一答案就是当const-ness实际上是使用(int*)或类似的方法进行的.当没有涉及强制转换时,为什么const限定符不在const对象上处理指针类型成员变量?
#include <iostream>
class bar {
public:
void doit() { std::cout << " bar::doit() non-const\n"; }
void doit() const { std::cout << " bar::doit() const\n"; }
};
class foo {
bar* mybar1;
bar mybar2;
public:
foo() : mybar1(new bar) {}
void doit() const {
std::cout << "foo::doit() const\n";
std::cout << " calling mybar1->doit()\n";
mybar1->doit(); // This calls bar::doit() instead of bar::doit() const
std::cout << " calling mybar2.doit()\n";
mybar2.doit(); // This calls bar::doit() const correctly
}
// ... (proper copying elided …Run Code Online (Sandbox Code Playgroud) 我们正在开发的软件系统需要在组件之间交换大量数据。数据的结构我们称之为变量树。这些数据本质上是组件之间的接口。代表特定接口的 C++ 代码是从接口描述自动生成的。进行实际数据交换有不同的底层实现,如 OPC/UA,但大部分代码都被屏蔽了。重要的节点类型是那些存储值和值数组的节点类型,它们几乎可以为任何类型实例化。
class node { /* whatever all nodes have in common */ };
class value_node : public node { /* polymorphic access to value */ };
template<typename T>
class typed_value_node : public value_node { /* type-safe access to value */ };
// imagine pretty much the same for array_node and typed_array_node
Run Code Online (Sandbox Code Playgroud)
因此,用于遍历这些树中节点的访问者基类具有接受所有整数类型(有符号和无符号)、所有浮点类型、布尔值和字符串的函数,无论是常量节点还是非常量节点。(我们目前计划将 enum 类型映射到 int/string 对,但对此没有一成不变的设置。)所有这些重载都存在于值和数组中。
目前,大约有 70 个重载:
class visitor {
public:
virtual ~visitor() = default;
virtual void accept( typed_value_node< char >&) = 0;
virtual …Run Code Online (Sandbox Code Playgroud)