我正在尝试从可变参数类型列表中提取类型的前缀。这是我的尝试:
#include <tuple>
#include <type_traits>
template <typename... Ts>
struct pack{};
template <size_t n, typename... Args>
struct prefix_tuple;
template <size_t n, typename... TPrefix, typename Tnext, typename... Ts>
struct prefix_tuple<n, pack<TPrefix...>, Tnext, Ts...>{
using type = typename
prefix_tuple<n-1, pack<TPrefix..., Tnext>, Ts...>::type;
};
template <typename... TPrefix, typename... Ts>
struct prefix_tuple<0, pack<TPrefix...>, Ts...>{
using type = std::tuple<TPrefix...>;
};
template <size_t n, typename... Args>
using prefix_tuple_t = typename
prefix_tuple<n, pack<>, Args...>::type;
bool f(){
return std::is_same_v<prefix_tuple_t<2, int, char, double>,
std::tuple<int, char> >;
}
Run Code Online (Sandbox Code Playgroud)
这在gcc 8.2上失败,原因是:
错误:“结构prefix_tuple …
这纯粹是一个哲学问题。我认为没有合理的上下文可以证明结果是有用的(给定nullptr)。
根据这个 - https://en.cppreference.com/w/cpp/language/integer_literal,整数文字的类型是int, long int, long long int, unsigned int, unsigned long intor unsigned long long int,如果文字的值没有,则可能有特定于实现的例外适合以上任何一种。这些类型都不能转换为void *,除非文字的值为 0。
不同的编译器对此有不同的处理方式。例如,考虑以下转换:
void g(void * p){}
void f(){
int i = 0;
void * p;
// p = i; // Fails. Also for other integral types.
p = 0; // Works. Also for 00, 0x0 and 0b0. Also when adding `u` and `l` suffixes.
g(0); // Also works.
// …Run Code Online (Sandbox Code Playgroud) 我了解到线程之间通信的一种方法是共享一些原子数据结构。例如:
struct Point {
int const x, y;
};
std::atomic<Point> some_point_in_shared_memory{Point{0, 0}};
Run Code Online (Sandbox Code Playgroud)
尽管Point::operator=(Point const &)被删除,但调用赋值运算符似乎没有问题std::atomic<Point>,如下所示:
some_point_in_shared_memory = Point{1, 2};
Run Code Online (Sandbox Code Playgroud)
如何实施此操作?
我可能会想到的一种解决方案是使用placement new在旧对象之上构造一个新对象,但显然它不是异常安全的。还是因为Point可以简单地复制而没关系?