如果我们有这样的代码:
#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) 如何在Redis中嵌入Lua中获取当前日期/时间?
我需要以下列格式--YYYY-MM-DD,HH:MM:SS
尝试使用os.date()但它无法识别它.
我正在实现一些非常类似std::vector但在堆栈上使用数组而不是内存分配的东西.
d-tor调用使用SFINAE的函数.
value_type是POD功能有空体.value_type是正常类std::string,则函数有一个正文并正确销毁所有数据.现在,我希望能够使用这个新std::vector的constexpr.然而,即使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数据类型的功能,我可以做什么来使类成为可能.
(当然不是在同一时间)
通常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是怎么做的?
是否可以使用 fmt 格式化带有千位分隔符的数字?
例如这样的东西:
int count = 10000;
fmt::print("{:10}\n", count);
Run Code Online (Sandbox Code Playgroud)
我正在研究 fmt,所以我正在寻找仅适用于 fmt 库的解决方案,而不以任何方式修改语言环境。
为了避免代码重复,我需要做这样的事情(在我的真实代码中,我有更复杂的类型,类似于T1和T2):
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) 我需要计算 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 那样具有可扩展性。
为什么DJB CDB(常量数据库)被设计为使用256个哈希表?
为什么不使用单个更大的 252 * 256 哈希表?
只是为了节省空间还是有其他原因?
如果你这样做:
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?
假设我们有这样的代码:
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,则不会发出警告.
这是为什么?增加变量并没有真正使用它.