小编Nic*_*ick的帖子

为什么 clang 处理这个简单的 std::variant 代码的异常?

如果我们有这样的代码:

#include <variant>

int main(){
    using V = std::variant<int, double>;
    V a = 5;
    V b = 5.6;

    a.swap(b);
}
Run Code Online (Sandbox Code Playgroud)

https://gcc.godbolt.org/z/oqGiHs

如果您使用 clang 进行编译,它会发出处理swap.

这是为什么?两种变体都是非空的,底层类型是异常安全的。

更新:

具有讽刺意味的是,这无一例外地编译:

#include <variant>

template<class T>
void sw(T &a, T &b){
    auto c = a;
    a = b;
    b = c;
}

int main(){
    using V = std::variant<int, double>;

    V a = 5;
    V b = 5.6;

    sw(a, b);
}
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang c++17 std-variant

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

在redis中获取lua中的当前日期和时间

如何在Redis中嵌入Lua中获取当前日期/时间?

我需要以下列格式--YYYY-MM-DD,HH:MM:SS

尝试使用os.date()但它无法识别它.

lua redis

6
推荐指数
2
解决办法
4342
查看次数

sfinae远离析构函数

我正在实现一些非常类似std::vector但在堆栈上使用数组而不是内存分配的东西.

d-tor调用使用SFINAE的函数.

  • 如果value_type是POD功能有空体.
  • 如果value_type是正常类std::string,则函数有一个正文并正确销毁所有数据.

现在,我希望能够使用这个新std::vectorconstexpr.然而,即使c-tor被声明constexpr,代码也不会编译,因为类有非平凡的d-tor.

这是代码的一小部分:

template<typename T, std::size_t SIZE>
class SmallVector{
    constexpr SmallVector() = default;

    ~SmallVector(){
        destructAll_<value_type>();
    }

    // ...

    template<typename X>
    typename std::enable_if<std::is_trivially_destructible<X>::value == true>::type
    destructAll_() noexcept{
    }

};
Run Code Online (Sandbox Code Playgroud)

constexpr如果value_type是POD并保持非POD数据类型的功能,我可以做什么来使类成为可能.
(当然不是在同一时间)

c++ sfinae constexpr c++14

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

如何通过值或常量引用传递 std::string_view

通常string_view用于这样的函数参数:

void fval(std::string_view sv);
void fcref(std::string_view const &sv);
Run Code Online (Sandbox Code Playgroud)

哪个更好?

const 引用是 8 个字节,string_view通常是它的两倍,例如 16 个字节。

但是,如果没有内联或优化掉,const 引用可能有两个间接引用 - 一个用于 ref,第二个用于内部指针。

STL是怎么做的?

string-view c++17

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

是否可以使用 fmt 格式化带有千位分隔符的数字?

是否可以使用 fmt 格式化带有千位分隔符的数字?

例如这样的东西:

int count = 10000;
fmt::print("{:10}\n", count);
Run Code Online (Sandbox Code Playgroud)

更新

我正在研究 fmt,所以我正在寻找仅适用于 fmt 库的解决方案,而不以任何方式修改语言环境。

c++ fmt

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

如何避免这种代码重复?

为了避免代码重复,我需要做这样的事情(在我的真实代码中,我有更复杂的类型,类似于T1T2):

template <class T1, class T2>
struct A 
{};

template <class T1, class T2>
struct B 
{};

template <class X>
struct C 
{
   using p1 = int;
   using p2 = char;

   using some = X<p1, p2>;
};

int main()
{
   C<A> o1; // must produce C<A<int,char> >
   C<B> o2; // must produce C<B<int,char> >
}
Run Code Online (Sandbox Code Playgroud)

c++ templates class class-template c++11

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

Cassandra 不同计数

我需要计算 Cassandra 中的一堆“东西”。我需要每隔几秒左右增加约 100-200 个计数器。

但是我需要计算不同的“事物”。

为了不计算两次,我在 CF 中设置了一个键,该程序在增加计数器之前读取,例如:

result = get cf[key];
if (result == NULL){
    set          cf[key][x] = 1;
    incr counter_cf[key][x];
}
Run Code Online (Sandbox Code Playgroud)

但是,此读取操作会大大降低集群速度。我尝试使用几列减少读取,例如:

result = get cf[key];

if (result[key1]){
    set          cf[key1][x] = 1;
    incr counter_cf[key1][x];
}

if (result[key2]){
    set          cf[key2][x] = 1;
    incr counter_cf[key2][x];
}

//etc....
Run Code Online (Sandbox Code Playgroud)

然后我将读取次数从 200+ 减少到大约 5-6,但它仍然减慢了集群的速度。

我不需要精确计数,但我不能使用位掩码,也不能使用布隆过滤器,因为会有 1M+++ 计数器,有些可能会超过 4 000 000 000。

我知道 Hyper_Log_Log 计数,但我也没有看到将它与这么多计数器(1M+++)一起使用的简单方法。

目前我正在考虑使用 Tokyo Cabinet 作为外部键/值存储,但是这个解决方案,如果有效,将不会像 Cassandra 那样具有可扩展性。

cassandra distinct-values

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

为什么 DJ Bernstein CDB(常量数据库)使用 256 个哈希表?

为什么DJB CDB(常量数据库)被设计为使用256个哈希表?

为什么不使用单个更大的 252 * 256 哈希表?

只是为了节省空间还是有其他原因?

cdb

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

为什么 constexpr 数据成员不是隐式静态的?

如果你这样做:

constexpr int LEN = 100;
Run Code Online (Sandbox Code Playgroud)

LEN变量定义为const无需键入const关键字。
它还具有static存储功能,无需键入static关键字。

另一方面,如果我们在class

struct A{
   constexpr static int SIZE = 100;
};
Run Code Online (Sandbox Code Playgroud)

SIZE仍然定义为const不需要输入 const 关键字,

然而SIZE不是static数据成员。
您需要static明确键入。如果不这样做,将出现编译错误。

问题是:
需要显式输入的原因是什么static

language-lawyer constexpr c++11

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

为什么gcc和clang都没有发出任何警告?

假设我们有这样的代码:

int check(){
    int x = 5;

    ++x; /* line 1.*/

    return 0;
}

int main(){
    return check();
}
Run Code Online (Sandbox Code Playgroud)

如果line 1已注释掉并且启动了编译器并启用了所有警告,则会发出:

warning: unused variable ‘x’ [-Wunused-variable]
Run Code Online (Sandbox Code Playgroud)

但是,如果我们取消评论line 1,即增加x,则不会发出警告.

这是为什么?增加变量并没有真正使用它.

对于,这都发生在GCC和Clang中.

c c++ gcc clang compiler-warnings

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