最近在我的代码中,我已经明确地编写noexcept(false)了我知道会抛出异常的函数,主要是为了阅读代码的人.但是,我想知道这是否会影响我的代码行为或编译器解释它的方式.它有什么不同吗?
注意:我知道析构函数是隐式noexcept,你必须指定noexcept(false)更改它,我想知道其他函数.
所述<algorithm>头部提供std::equal_range(),以及具有作为它的成员函数的一些容器.让这个函数困扰我的是它返回一对迭代器,使得从开始迭代器迭代到结束迭代器变得繁琐.我希望能够使用std::begin(),std::end()以便我可以使用基于C++ 11范围的for循环.
现在,我听到关于矛盾的信息,以专业std::begin()和std::end()-我已经被告知,添加什么不确定的行为std命名空间的结果,而我也被告知,你可以提供自己的专长std::begin()和std::end().
这就是我现在正在做的事情:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
Run Code Online (Sandbox Code Playgroud)
这确实有效:http://ideone.com/wHVfkh
但我想知道,这样做的缺点是什么?有一个更好的方法吗?
#include <initializer_list>
#include <vector>
struct test
{
using t = std::vector<test>;
test(t const &v)
{
}
test(t &&v)
{
}
test(std::initializer_list<test> v)
: test{t{v}} //error
{
}
};
Run Code Online (Sandbox Code Playgroud)
无论锵和GCC抱怨说,第三个构造函数,一个以初始化列表中,代表们本身.我不明白这是怎么可能的,因为你无法从向量构造初始化列表.
通过用圆括号替换外部花括号来修复错误是微不足道的,但为什么这首先是一个问题呢?这几乎相同的程序编译得很好:
#include <initializer_list>
struct a {};
struct b {};
struct test
{
test(a const &)
{
}
test(a &&)
{
}
test(std::initializer_list<b> v)
: test{a{}} //no error, still using curly braces
{
}
};
Run Code Online (Sandbox Code Playgroud)
有趣的是,使用上面的第二个例子,如果你用替换b,错误会重新出现test.有人能解释一下这里发生了什么吗?
对于某些编译器,在C程序中使用pow和某些其他功能需要链接到m库.但是,某些编译器不需要这样做,并且在链接到m库时会出错.对于带有std::thread和的C++,存在几乎完全相同的情况pthread,但是CMake模块FindThreads完全缓解了这种情况 - 是否有一些类似于libm的模块?
检测CMake如何处理的最佳方法是什么?这是我目前的解决方案,这不太理想,因为有更多的C编译器,而不仅仅是GCC和MSVC:
if(NOT MSVC)
target_link_libraries(my-c-target PUBLIC m)
endif()
Run Code Online (Sandbox Code Playgroud)
这适用于我的目的,但我很确定有些情况会失败并需要手动用户干预,这对于不了解这种默默无闻的人来说并不好玩.理想情况下,我不希望用户必须通过命令行指定他们的编译器是否很奇怪 ; 我想在CMake中自动检测它,因为这是CMake的全部内容.
在 C++ 中执行外部程序并从中获取返回码的简单、优雅且有效的跨平台方式是什么?
int execute(std::string const &path, std::vector<std::string> const &arguments = {})
{
//...
}
Run Code Online (Sandbox Code Playgroud)
由于我们在继续执行之前等待被调用程序完成,因此被调用程序应该使用我们程序的输入/输出/错误流。如果由于多种原因path不能执行,只需抛出异常(例如std::invalid_argument)。
显然,不要使用system().
我有一个模板类,只能为标量类型(整数,浮点数等)实例化,我希望成员typedef始终是该类型的有符号变体.那是:
unsigned int- > signed int
signed long long- > signed long long(已签名)
unsigned char- > signed char
float- > float
long double- >long double
等...
不幸的是,std::make_signed只适用于整数类型,而不适用于浮点类型.最简单的方法是什么?我正在寻找形式的东西,成为using SignedT = ...;模板参数T的模板化类的一部分已经保证是标量.
传统的PImpl Idiom是这样的:
#include <memory>
struct Blah
{
//public interface declarations
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
//in source implementation file:
struct Blah::Impl
{
//private data
};
//public interface definitions
Run Code Online (Sandbox Code Playgroud)
但是,为了好玩,我尝试使用具有私有继承的组合:
[Test.h]
#include <type_traits>
#include <memory>
template<typename Derived>
struct PImplMagic
{
PImplMagic()
{
static_assert(std::is_base_of<PImplMagic, Derived>::value,
"Template parameter must be deriving class");
}
//protected: //has to be public, unfortunately
struct Impl;
};
struct Test : private PImplMagic<Test>,
private std::unique_ptr<PImplMagic<Test>::Impl>
{
Test();
~Test();
void f();
};
Run Code Online (Sandbox Code Playgroud)
[第一个翻译单位]
#include "Test.h"
int main() …Run Code Online (Sandbox Code Playgroud) 我知道泛型lambda,我知道变量模板,但是,这有什么作用?它甚至被允许了吗?
template<typename T>
auto f = [](auto a, T b){ /**/ };
Run Code Online (Sandbox Code Playgroud)
如果允许,可以按预期使用吗?那就是f<type>(var_a, var_b)?
<p>Hello</p>
<p>Hello</p>
<p><span style="border: 5px dotted blue; border-radius: 1em;">Hello</span></p>
<p>Hello</p>
<p>Hello</p>
Run Code Online (Sandbox Code Playgroud)
在Chrome中呈现:

渲染时,边框"占用空间"并抵消内容的位置以及增加内容所需的大小.有没有办法让边界不这样做?也就是说,边框没有边框的任何间距/填充效果?
期望的效果是内容总是在相同位置,无论它是否具有边界(例如,上面截图中的所有H将具有相同的水平对齐).我可以接受重叠内容的边框以及向外延伸,但如果可能的话,我想知道如何做到这两点.
我已经考虑过在不需要时使边框始终存在但是透明,但这会使间距和填充非常麻烦,我想要有不同大小的边框.
注:我很能如果需要使用CSS3和HTML5.