我有一个std::queue被包装为模板化的类来创建一个线程安全的队列.我有这个类的两个版本:一个存储值类型,一个存储指针类型.
对于指针类型,我在销毁时删除队列的元素时遇到问题.原因是我不知道如何安全地从队列中删除项目.
该参考状态(无思考力的,所以我想它实际上并没有状态的话)是从队列中删除元素的唯一方法是调用pop().该引用还表示pop()调用该项的析构函数.
好吧,这会导致我的指针类型出现问题,因为它们可能会或可能不会指向聚合.如果其中一个指向聚合,它们都会,但由于包装是模板化的,因此无法保证我们正在处理哪种类型(聚合或非聚合).
那么,当pop()调用析构函数时,会发生什么?如何确保删除所有内容并正确释放内存?
最后,我的解决方案是使用旧版本的GCC for ARM9.我无法控制这一点.我知道有些库有智能指针和容器可以在这里提供帮助,但它们对我来说是禁止的.
该std::type_info课程不可复制.这使得将其存储在对象中以供以后使用变得困难.我该怎么办?
我想通过我声明的两个指针将文本输出到文件:
wchar_t *Col1="dsffsd", *Col2="sdfsf";
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
std::ofstream fout;
fout.open(NativeDatabasePathHist);
fout<<"testing";
fout<<" "<<Col1<<" "<<Col2;
fout.close();
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
测试113 113
为什么当我打印Col1和Col2,我得到的数字,而不是字符串?
我想用std::stoi.虽然我可以使用::atoi(str.c_str())它会使代码更清洁,如果这将工作.但Eclipse告诉我:
函数'stoi'无法解决
我查了一下
<string>包括在内,std::string,-std=c++0x -std=c++11也是设置的.是stoi()失踪的gcc,或者是不知何故我的错?
我正在使用gcc(Debian 4.7.2-4)4.7.2.
我正在尝试Subject从观察者模式中编写一个安全类.我想知道使用weak_ptr是否是以下列方式存储IObserver实例的最佳方式:
IObserver被释放后无法使用实例.Subject类不抱上IObserver应free'd引用(流逝的听众的问题).Subject类必须是线程安全的.不幸的是,我们的编码标准说我们不允许使用boost.我想我以前的生活中是一个坏人.幸运的是,我被允许使用C++ 11(Visual Studio 2012附带的内容).
这是一个示例Observer类.
// Observer interface that supports notify() method
class IObserver
{
public:
virtual void notify() const = 0;
virtual ~IObserver() {}
};
// Concrete observer implementation that prints a message
class Observer : public IObserver
{
public:
Observer( const std::string& message) : m_message( message ){}
void notify() const {
printf( "%s\r\n", m_message.c_str() …Run Code Online (Sandbox Code Playgroud) 我无法找到这个问题,这是我面临的一个实际问题.
我有一个文件加载实用程序,返回std::vector<unsigned char>包含整个文件内容.但是,处理函数需要contiguos数组char(并且不能更改 - 它是库函数).由于使用处理函数的类仍然存储数据的副本,我想将其存储为vector<char>.这里的代码可能更具说明性.
std::vector<unsigned char> LoadFile (std::string const& path);
class Processor {
std::vector<char> cache;
void _dataOperation(std::vector<char> const& data);
public:
void Process() {
if (cache.empty())
// here's the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为(显然)没有适当的转换.但是,我们可以确定临时向量将占用相同数量的内存(IOW sizeof(char) == sizeof(unsigned char))
天真的解决方案是迭代临时内容并投射每个角色.我知道在正常情况下,operator= (T&&)会被调用.
在我的情况下,重新解释转换是安全的,因为我确信我只会读取ASCII字符._dataOperation无论如何,任何其他角色都会被抓住.
所以,我的问题是:如何以一种不涉及复制的方式正确安全地转换临时向量?
如果不可能,我宁愿采用安全的复制方式而不是不安全的非复制方式.我也可以LoadFile改为返回vector<char>或vector<unsigned char>.
我正在尝试使用std :: async来加速程序.假设我有一个功能
T* f (const T& t1, const T& t2, const T& t3)
Run Code Online (Sandbox Code Playgroud)
其中T是一种复制成本昂贵的类型.我有几个独立的f调用不同的参数,我尝试将它们与std :: async并行化,如下所示:(其中m_futures是正确类型的期货的std :: vector).
for (...) {
m_futures.push_back (
std::async(
std::launch::async,
f,
a,b,c));
}
Run Code Online (Sandbox Code Playgroud)
我发现上面的代码减慢了程序的执行速度.我使用gdb逐步完成它,当创建未来时,T的复制构造函数被调用三次.这是为什么?参数a,b,c是堆分配的,但编译器可能不知道它?我能以某种方式明确表达吗?
是否始终是std :: async创建参数的副本,即使它们应该由const引用传递?能以某种方式避免这种情况吗?在我天真的想法中,应该只有一个指针传递给函数的不同调用(无论如何只能从内存中读取.)如果重要的话,我在Linux上使用gcc-4.6.3.
为什么不呢
std::atomic<int> index;
Run Code Online (Sandbox Code Playgroud)
工作?
目前使用LLVM 3.1与这些参数
C Language Dialect GNU [-std=gnu99]
C++ Language Dialect [-std=c++11]
C++ Standard Library libc++(LLVM C++ standard library with C++11 support)
Run Code Online (Sandbox Code Playgroud) 在此示例中,coord_squared_t是整数类型的别名,其大小至少是整数类型的两倍coord_t:
typedef int_least32_t coord_t;
coord_squared_t CalculateSquaredHypothenuse(coord_t x, coord_t y){
coord_squared_t _x=x;
coord_squared_t _y=y;
return _x*_x+_y*_y;
}
Run Code Online (Sandbox Code Playgroud)
什么可以用来表现coord_squared_t在以下方面coord_t?标准库中是否有任何东西可以让我做一些像double_width<coord_t>::type获得正确宽度的东西,而不是明确选择类型?
C++ 11或C++ 14很好.
在某些情况下,请参见下面一个例子,std::is_floating_point在返回false的float.
#include <iostream>
#include <type_traits>
#include <vector>
int main()
{
::std::cout << typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])).name() << ::std::endl;
if (::std::is_floating_point< decltype(::std::vector< float >()[::std::vector< float >().size()]) >::value)
{
::std::cout << "floating point" << ::std::endl;
}
else
{
::std::cout << "not floating point" << ::std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC的输出
f
not floating point
Run Code Online (Sandbox Code Playgroud)
在这个例子中,人们可以看到它typeid被::std::vector< float >()[::std::vector< float >().size()]视为a float,它返回正确的名称.人们也可以检查typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])) == typeid(flat)退货true.但是, …