小编Ori*_*ent的帖子

平凡的默认可构造std :: optional和std :: variant

是否允许以这种方式设计std::optional(当前std::experimental::optional),对于简单的默认可构造类型,T相应std::optional< T >的也是简单的默认可构造的?

同样的问题退出std::variant及其整体鉴别器.

我自己的答案是:"不,它不能以这种方式设计,因为如果对象具有自动存储持续时间或者reinterpret_cast来自非零初始化存储的-ed,则在默认初始化期间获得的积分鉴别器的值将是不确定的. " 我不介意每次要求用户进行值初始化.

c++ variant optional c++11 c++14

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

const最佳匹配函数与其他函数之间的歧义

让我们考虑以下示例:

#include <type_traits>

#if 1
struct X {};

struct O
{
    O(X) { ; }
};
#else
struct O {};

struct X
{
    operator O () { return {}; }
};
#endif

static_assert(std::is_convertible< X, O >::value);

struct S
{
    void f(X) const { ; }
    void f(O) { ; }
};

#include <cstdlib>

int
main()
{
    S s;
    s.f(X{});
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

实例

它给出了一个错误:

 error: call to member function 'f' is ambiguous
Run Code Online (Sandbox Code Playgroud)

当我删除const-qualifier时,错误就不复存在了.如果我将const-qualifier 添加到第二次重载,同样会发生同样的情况f.即如果两个过载都是同等的 …

c++ overloading

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

对数时间内聚合的数量

如何在对数(至少以二为底)编译时间(严格来说,以对数实例化数量)中定义聚合的数量?

我目前能做的就是在线性时间内实现期望的目标:

#include <type_traits>
#include <utility>

struct filler { template< typename type > operator type (); };

template< typename A, typename index_sequence = std::index_sequence<>, typename = void >
struct aggregate_arity
    : index_sequence
{

};

template< typename A, std::size_t ...indices >
struct aggregate_arity< A, std::index_sequence< indices... >, std::__void_t< decltype(A{(indices, std::declval< filler >())..., std::declval< filler >()}) > >
    : aggregate_arity< A, std::index_sequence< indices..., sizeof...(indices) > >
{

};

struct A0 {};
struct A1 { double x; };
struct A2 { int i; …
Run Code Online (Sandbox Code Playgroud)

c++ aggregate type-traits c++11 c++14

5
推荐指数
2
解决办法
826
查看次数

当无关类型定义为别名时,调用函数是不明确的

阅读了一篇很棒的文章真实的故事:高效的包装我试着自己实现元组作为练习:

#include <type_traits>
#include <utility>
#include <functional>

template< std::size_t I, typename T >
struct tuple_leaf { T value; };

template< std::size_t I, typename T >
T & get(tuple_leaf< I, T > & leaf)
{ return leaf.value; }

template< typename Is, typename ...Ts >
struct tuple_base;

template< std::size_t ...Is, typename ...Ts >
struct tuple_base< std::index_sequence< Is... >, Ts... >
    : tuple_leaf< Is, Ts >...
{
    using tuple_base_t = tuple_base;
    template< typename ...Args, typename = std::enable_if_t< (sizeof...(Ts) == sizeof...(Args)) > …
Run Code Online (Sandbox Code Playgroud)

c++ overload-resolution argument-dependent-lookup c++11

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

在位掩码中选择与选择器位图中的1位重叠的设置位的跨度

鉴于:

  • 一种位掩码a(例如std::uint64_t),其中至少包含一组(1)位。
  • 一种选择器位掩码b,它是aa & b == b)的子集,并至少设置了一位。

我想选择连续的1位跨度,a其中与1位重叠b

a = 0b1111001110001100;
b = 0b0000001010001000;
//c=0b0000001110001100
//    XXXX  YYY   ZZ
Run Code Online (Sandbox Code Playgroud)

XXXX组为0,c因为b & XXXX为false。复制ZZ组,因为b设置了Z位之一。c出于同样的原因,也设置了YYY组。 请注意,b的单个组中可以有多个设置位a

因此,对于1s in中的每个连续组a,将cif b中的所有这些位设置为1在这些位置中的任何位置。一个更复杂的示例:

std::uint64_t a = 0b1101110110101;
std::uint64_t b = 0b0001010010001;
// desired   c == 0b0001110110001
// contiguous groups   ^^^ …
Run Code Online (Sandbox Code Playgroud)

c++ x86 bit-manipulation bmi

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

比较有序关联容器的插入与提示的保证

我想将新的(唯一的)元素插入到有序关联容器中的已知位置(通常位于中间某处)std::set/ std::multiset/ std::map/ std::multimap使用insert(w/hint)或emplace_hint.

在插入操作期间,我绝对肯定,插入的位置正好在"提示"迭代器之前.通常我可以比较容器中的任何两个非相邻元素,但这个操作非常重量级.为了避免开销,我为容器提供了自定义比较器,它包含对两个neigbouring元素的指针的引用(它们总是在插入/放置操作之前就已知).

#include <map>
#include <set>

static std::size_t counter = 0;

template< typename T >
struct less
{ 

    T const * const & pl;
    T const * const & pr;

    bool operator () (T const & l, T const & r) const
    {
        if (&l == &r) {
            return false;
        }
        if (pl) {
            if (&l == pl) {
                return true;
            } 
            if (&r == pl) {
                return …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm containers stl associative

5
推荐指数
0
解决办法
146
查看次数

为什么const over值引用在重载分辨率期间优先于const rvalue引用

为什么没有歧义?

struct B {};
struct C {};

struct A
{
    A(B const &, C const &) {}
    A(B const &&, C const &&) = delete;
#if 0
    A(B const &, C const &&) = delete;
    A(B const &&, C const &) = delete;
#endif
};

B const b() { return {}; } // const result type may make sense
C const c() { return {}; } // for some user-defined types

int main()
{
    A a0{B{}, C{}}; // I want …
Run Code Online (Sandbox Code Playgroud)

c++ constructor rvalue-reference c++11 c++14

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

解压为函数参数

理论上是否可以添加语言功能以将结构解压到函数实际参数列表中?我的意思是以下内容。

template< typename ...Ts >
void f(Ts... values) { (std::cout << ... << values) << std::endl; }

struct S { int a; char c; double d; };
S s{1, '2', 3.0};
f([s]);

void g(int, int, int) {}

g([s]); // warning about narrowing conversion

void h(int &, int &, int &) {}

h([s]); // hard error ("cannot bind to...")
Run Code Online (Sandbox Code Playgroud)

处理成员数量未知的合适结构会很方便。因为由于缺乏模板上下文,当前的结构化绑定无法“解压”未知数量的组件(例如 )的结构,而模板上下文只能处理可变数量的类型/值。auto... [x] = s;operator ...

这种方式有什么缺点?

c++ language-lawyer c++17 structured-bindings

5
推荐指数
0
解决办法
940
查看次数

cmake 检测哪个库 libc++ 或 libstdc++ 配置为针对 g++ 或 clang++ 使用

我编写了一个使用或CMakeLists.txt构建项目的方法。g++clang++

为了捕获尽可能多的错误,我同时使用libc++with -D_LIBCPP_DEBUG2=2(for clang++) 和libstdc++with -D_GLIBCXX_DEBUG(for Both g++and clang++)。

set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -fno-inline -DDEBUG=1 -march=x86-64 -mtune=generic")
#[[
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG2=2")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG")
endif()
]]
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG=1 -march=native")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-fno-omit-frame-pointer -DNDEBUG=1 -march=native")
    if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
        set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -gline-tables-only")
    elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
        set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Og -ggdb")
    endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
    set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os …
Run Code Online (Sandbox Code Playgroud)

gcc cmake clang libstdc++ libc++

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

在Qt Quick中从ListView制作自定义TableView的典型方法

制作餐桌的最佳方法是什么ListView

比方说,给定一个2d字符串数组,delegate所有列都是Labels.如何以及何时仅使用QML计算每列的最大项目宽度?每个的内容Label不是恒定的(即implicitWidth在寿命期间是可变的).

发明这个TableView事实的实际原因是,TreeView将保留一步.

qt listview tableview qml qtquick2

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