是否允许以这种方式设计std::optional(当前std::experimental::optional),对于简单的默认可构造类型,T相应std::optional< T >的也是简单的默认可构造的?
同样的问题退出std::variant及其整体鉴别器.
我自己的答案是:"不,它不能以这种方式设计,因为如果对象具有自动存储持续时间或者reinterpret_cast来自非零初始化存储的-ed,则在默认初始化期间获得的积分鉴别器的值将是不确定的. " 我不介意每次要求用户进行值初始化.
让我们考虑以下示例:
#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.即如果两个过载都是同等的 …
如何在对数(至少以二为底)编译时间(严格来说,以对数实例化数量)中定义聚合的数量?
我目前能做的就是在线性时间内实现期望的目标:
#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) 阅读了一篇很棒的文章真实的故事:高效的包装我试着自己实现元组作为练习:
#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) 鉴于:
a(例如std::uint64_t),其中至少包含一组(1)位。b,它是a(a & 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) 我想将新的(唯一的)元素插入到有序关联容器中的已知位置(通常位于中间某处)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) 为什么没有歧义?
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) 理论上是否可以添加语言功能以将结构解压到函数实际参数列表中?我的意思是以下内容。
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 ...
这种方式有什么缺点?
我编写了一个使用或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) 制作餐桌的最佳方法是什么ListView?
比方说,给定一个2d字符串数组,delegate所有列都是Labels.如何以及何时仅使用QML计算每列的最大项目宽度?每个的内容Label不是恒定的(即implicitWidth在寿命期间是可变的).
发明这个TableView事实的实际原因是,TreeView将保留一步.