小编NuP*_*adi的帖子

静态变量初始化的线程安全性

我想知道Get()下面代码中对不同参数类型的2次调用是否是线程安全的:

struct MethodTypeIndex
{
    template <typename T>
    static size_t Get(T)
    {
        static size_t index = NextIndex();
        return index;
    }
private:
    static size_t NextIndex()
    {
        static size_t nextIndex = 0;
        return nextIndex++;
    }
};
Run Code Online (Sandbox Code Playgroud)

一方面,NextIndex()在初始化期间调用index并根据标准:

§6.7 [stmt.dcl] p4
Run Code Online (Sandbox Code Playgroud)

如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.

另一方面,我不知道是否将调用NextIndex()视为初始化的一部分index.如果没有,支撑初始化会有所不同吗?

static size_t index{ NextIndex() };
Run Code Online (Sandbox Code Playgroud)

或者,如果我不想制作nextIndex原子线,还有其他方法可以使线程安全 吗?

c++ multithreading c++11

13
推荐指数
1
解决办法
1080
查看次数

integral_constant vs constexpr

您能解释一下,为什么以下示例中的integral_constant和constexpr方法导致不同的行为?

#include <iostream>

using namespace std;

struct Logger
{
//    template<typename Type>
//    using IsRawString =
//        std::integral_constant<bool, std::is_same<const char*, Type>::value || std::is_same<char*, Type>::value>;

    template<typename Type>
    constexpr bool IsRawString()
    {
        return std::is_same<const char*, Type>::value || std::is_same<char*, Type>::value;
    }

    template<typename Type, typename Enable = void>
    struct Traits
    {
        static const int Index = 1;
    };

    template<typename Type>
    struct Traits<Type, std::enable_if_t<IsRawString<Type>()>>
    {
        static const int Index = 2;
    };

    template<typename Type>
    struct Traits<Type, std::enable_if_t<std::is_pointer<Type>::value && !IsRawString<Type>()>>
    {
        static const int Index = …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

7
推荐指数
1
解决办法
363
查看次数

如何确定数组元素的类型?

我无法获得元素的类型.此解决方案返回对元素类型的引用.

int arr[] = { 0, 1, 2, 3, 4, 5 };
using arrElemType = decltype(*arr);
vector<arrElemType> vec(std::cbegin(arr), std::cend(arr));
Run Code Online (Sandbox Code Playgroud)

c++ arrays vector c++11

5
推荐指数
2
解决办法
4187
查看次数

如何在一个范围内处理多个数组?

我想使用复制数组range for.可能吗?

像(显然不工作)的东西

unsigned arr[15] = {};
unsigned arr2[15];

for (auto i : arr, auto &j : arr2)
    j = i;
Run Code Online (Sandbox Code Playgroud)

或者是否有一些其他技巧可以避免操作数组的大小,如果我确定它们具有相同的长度?

UPD 我非常喜欢@PavelDavydov解决方案.但是,任何人都可以提供标准的lib解决方案.C++ 11也包含对和元组.

for (auto pair : std::make_tuple(&arr, &arr2));
Run Code Online (Sandbox Code Playgroud)

c++ arrays c++11

4
推荐指数
2
解决办法
257
查看次数

如何使用范围传递给函数的数组

我想写一个函数,传递一个数组,并有可能使用范围内部.我设法只为固定大小的数组.

void print(unsigned (&arr)[11]){
    for (unsigned val : arr)
        cout << val << ' ';
    cout << endl;
}

void main() {
    unsigned arr[11] = {};    
    print(arr);
}
Run Code Online (Sandbox Code Playgroud)

如何为可变大小的数组做到这一点?谢谢.

c++ arrays c++11

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

标签 统计

c++ ×5

c++11 ×5

arrays ×3

multithreading ×1

templates ×1

vector ×1