标签: c++03

C++,set_terminate是每个线程的本地吗?

应该set_terminate/ get_terminate为C++ 2011或C++ 2003中的多个线程设置不同的终止异常处理器?

例如,如果我有程序并设置终止处理程序func_1; 然后我开始3个线程.什么是新线程中的终止处理程序?如果在每个线程中我将设置终止处理程序到func_2第一个线程,func_3第二个线程等等.

N3242(C++ 2011草案)[handler.functions][support.exception]/ 或中没有说明[exception.terminate]

PS:对于这些标准的任何流行实现,您可以回答C++ 2011或C++ 2003

PPS:有FCD评论... C++ FCD评论状态版本5 N3249(2011):

GB 71    18.6.2.4 / 18.8.2.2 / 18.8.3.2   
Run Code Online (Sandbox Code Playgroud)

的线程安全std::set_new_handler(),std::set_unexpected(),std::set_terminate(),是不确定使得功能不可能一个线程安全的方式使用.

必须指定函数的线程安全保证,并且应提供新接口,以便以线程安全的方式查询和安装处理程序.

LWG 1365 接受修改

见文件 N3189

c++ exception-handling language-lawyer c++11 c++03

11
推荐指数
1
解决办法
2968
查看次数

C++ std容器的线程安全性

我在这里阅读了很多帖子,问题是C++的标准容器(如"list"或"map"是线程安全的,所有人都说它不是一般的.并行读取应该没问题,但并行写入或者并行读写可能会导致问题.

现在我发现在www.cplusplus.com上,在大多数操作期间访问或修改列表是安全的.

一些例子:

地图::找到

访问容器(const和非const版本都不会修改容器).不访问映射值:同时访问或修改元素是安全的.

地图::插入

容器已修改.同时访问现有元素是安全的,尽管容器中的迭代范围不是.

我是否想念cplusplus.com或者我还有什么关于std容器中线程安全的知识.

提前致谢!

PS:我要的是C++ 03而不是C++ 11

c++ multithreading stl c++03

11
推荐指数
2
解决办法
2914
查看次数

如何在MISRA C++之后实现CRTP

我的团队正在开发一个嵌入式系统,我们需要遵循MISRA C++.

我们正在重构代码以使用更少的虚方法,因此我们尝试实现CRTP以使用静态多态而不是动态多态.

但是我们遇到静态多态性需要指针转换的问题,因此我们的静态分析检查器会抱怨.

这是界面

template <typename T>
class UpdateMethod
{
protected:
    ~UpdateMethod() {}
 public:
    void operator()() const
    {
        // [MISRA Rule 5-2-7] violation:
        static_cast<const T*>(this)->update();
    }
};
Run Code Online (Sandbox Code Playgroud)

以下是其中一个实现:

class A
    : public UpdateMethod<A>
{
 public:
    void update() const {}
};
Run Code Online (Sandbox Code Playgroud)

在通过MISRA检查程序时,它会抱怨static_cast(从ptr转换为ptr(e926).

所以,我的问题是:有没有什么好的方法来实现CRTP而不必压制MISRA警告,所以以安全的方式?

仅有关于指针转换的相关问题: MISRA C++ 2008规则5-2-7违规:指针类型的对象不应直接或间接转换为无关指针类型 我在CRTP中具有相同的错误.

编辑:正如前面提到的只有C++ 03而没有像boost这样的外部库.

c++ misra crtp static-cast c++03

11
推荐指数
1
解决办法
374
查看次数

在C++中将char赋值给int引用和const int引用

我注意到将a分配charconst int&编译,但将其分配给a int&会产生编译错误.

char c;
int& x = c;    // this fails to compile
const int& y = c;    // this is ok
Run Code Online (Sandbox Code Playgroud)

我知道这样做不是一个好习惯,但我很想知道它发生的原因.

我通过寻找"分配给不同类型的引用","将char分配给int引用"和"const引用与非const引用之间的区别"来搜索答案,并且遇到了许多有用的帖子(int VS const int的和,分配一个char到一个int变量时怪异的行为,转换字符在C和C++为int,参考和const引用作为函数参数之间的区别是什么?),但他们似乎并不是解决我的问题.

如果以前已经回答过,我很抱歉.

c++ casting const reference c++03

10
推荐指数
1
解决办法
352
查看次数

确定:: std :: numeric_limits <T>是否可以安全地实例化

类模板::std::numeric_limits<T>只能为类型实例化,类型T可以是函数的返回值,因为它总是定义成员函数,如static constexpr T min() noexcept { return T(); }(更多信息请参见http://www.cplusplus.com/reference/limits/numeric_limits/) c ++ 03或c ++ 11中的特殊版本.

如果T是,即int[2]实例化将立即导致编译时错误,因为int[2]不能是函数的返回值.

::std::numeric_limits使用安全版本进行包装很容易 - 如果确定实例化::std::numeric_limits是否安全的方法是已知的.这是必要的,因为如果可能的话,应该可以访问有问题的功能.

显而易见(显然是错误的)测试方法::std::numeric_limits<T>::is_specialised不起作用,因为它需要实例化有问题的类模板.

有没有办法测试实例化的安全性,最好不要列举所有已知的坏类型?甚至可能是确定任何类模板实例化是否安全的一般技术?

c++ templates c++11 c++03

10
推荐指数
2
解决办法
1057
查看次数

多种类型的模板专业化

标题有点含糊不清.

可以说我有一个模板定义为:

template < typename T >
void foo ( int x ) ;
template <>
void foo<char> ( int x ) ;
template <>
void foo<unsigned char> ( int x ) ;
template <>
void foo<short> ( int x ) ;
...
Run Code Online (Sandbox Code Playgroud)

内部都foo<signed>()foo<unsigned>()做同样的事情.唯一的要求是T8位类型.

我可以通过创建另一个模板来定义基于大小的标准类型.

template < typename T, size_t N = sizeof( T ) > struct remap ;
template < typename T, size_t > struct remap< 1 >
{
    typedef unsigned char value; …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++03

10
推荐指数
2
解决办法
1万
查看次数

寻找boost的变换迭代器的复合特征模式

那个设定

如果你想让迭代器在返回之前与它们迭代的东西一起旋转,那就boost::transform_iterator非常好了.你传递一个一元函数,它转换底层迭代器的结果,operator*()然后转换迭代器返回:

template<typename Map>
struct iterator_transform_traits_map_second {
  typedef typename Map::value_type    value_type;
  typedef typename Map::mapped_type   result_type;
        result_type& operator()(      value_type& v) const {return v.second;}
  const result_type& operator()(const value_type& v) const {return v.second;}
};

typedef 
    boost::transform_iterator<iterator_transform_traits_map_second> 
    transformed_iterator;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但.

这导致了什么混乱

你的同事喜欢这个闪亮的新工具,并且也开始使用它,很快就会有人收集你们目前为止所提出的内容.这是我们的:

  • iterator_transform_traits_map_first
  • iterator_transform_traits_map_second
  • iterator_transform_traits_map_deref (取消引用任何容器的条目)
  • iterator_transform_traits_map_deref_second(取消引用地图条目second)
  • iterator_transform_traits_map_dynamic_cast(执行dynamic_cast<>()任何容器的输入)
  • iterator_transform_traits_map_any_second(执行any_cast<>()地图条目second)

当然,这留下了许多有用的(因为还没有人需要它们),并且它根本不能扩展.我的任务是编写一个迭代器来取消引用地图条目second并执行一个dynamic_cast<>(),我是谁,我被拒绝只是添加一个iterator_transform_traits_map_dynamic_cast_deref_second并继续前进.

我想要的是

相反,我试图写一些基本特征和编译时组成特征,允许将其中几个命名为模板参数,并简单地管理调用.理想情况下,我想要这样的东西:

typedef 
    boost::transform_iterator< 
        iterator_transform_traits< iter_transf_tr_second
                                 , iter_transf_tr_deref …
Run Code Online (Sandbox Code Playgroud)

c++ boost traits c++03

10
推荐指数
1
解决办法
270
查看次数

deque如何具有摊销的常数时间复杂度

我读到这里从一个std ::双端队列具有以下特点公认的答案

1- Random access - constant O(1)
2- Insertion or removal of elements at the end or beginning - amortized constant O(1)
3- Insertion or removal of elements - linear O(n)
Run Code Online (Sandbox Code Playgroud)

我的问题是关于第2点.双端队列如何在结束或开始时进行摊销?

我知道a std::vector在最后插入时具有摊销的常数时间复杂度.这是因为矢量是连续的并且是动态阵列.因此,当最后一个内存耗尽push_back时,它将分配一个全新的内存块,将现有项目从旧位置复制到新位置,然后从旧位置删除项目.我理解的这个操作是摊销不变的.这如何适用于双端队列?如何在双端队列的顶部和底部插入是否可以摊销.我的印象是它应该是常数O(1).我知道一个双端队列由内存块组成.

c++ deque c++03

10
推荐指数
1
解决办法
2075
查看次数

如何在C++中检索基类的类型?

对于这个特定项目,我无法使用C++ 11功能(例如decltype),因为编译器还不支持它们.我需要能够提供当前类作为模板参数,最好是在没有参数的宏中(见下文),而不需要修饰class声明或隐藏花括号等.

class Foo: private Bar<Foo> {
   MAGIC //expands to using Bar<Foo>::Baz; and some others
   public:
      void otherFunction();
      //... the rest of the class
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望这与Qt的Q_OBJECT宏非常相似,但不会引入另一个预编译步骤和相关的生成类.typeid可能在运行时很有用,但我的目标是在构建时完成所有这些.

如何编写MAGIC宏以便每次都不需要重复类名?

c++ templates c-preprocessor c++03

10
推荐指数
1
解决办法
191
查看次数

返回前RVO覆盖参数值

在AIX上使用xlC编译以下内容会导致打印"2 2"的代码.在使用gcc和clang的Linux上,它可靠地生成"3 3".

#include <iostream>

struct Numbers
{
    Numbers() : a(0) , b(0) { } 
    Numbers(int a, int b) : a(a), b(b) { }

    int a;
    int b;
};

Numbers combine(const Numbers& a, const Numbers& b)
{
    Numbers x;
    x.a = a.a + b.a;
    x.b = a.b + b.b;
    return x;
}

Numbers make()
{
    Numbers a(1, 1);
    Numbers b(2, 2);

    a = combine(a, b);
    return a;
}

int main()
{
    Numbers a = make();
    std::cerr << a.a << " …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++03

10
推荐指数
1
解决办法
155
查看次数