小编Ben*_*y K的帖子

可变参数类型列表前缀的C ++ std :: tuple

我正在尝试从可变参数类型列表中提取类型的前缀。这是我的尝试:

#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 …

c++ metaprogramming

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

c++中值0的特殊状态是什么?

这纯粹是一个哲学问题。我认为没有合理的上下文可以证明结果是有用的(给定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)

c++ literals null-pointer

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

std::atomic&lt;T&gt;::operator= 如何为不可变类型实现?

我了解到线程之间通信的一种方法是共享一些原子数据结构。例如:

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可以简单地复制而没关系?

c++ thread-safety exception-safety stdatomic

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