我想知道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原子线,还有其他方法可以使线程安全 吗?
您能解释一下,为什么以下示例中的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) 我无法获得元素的类型.此解决方案返回对元素类型的引用.
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) 我想使用复制数组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) 我想写一个函数,传递一个数组,并有可能使用范围内部.我设法只为固定大小的数组.
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)
如何为可变大小的数组做到这一点?谢谢.