我有生成lambda的函数,它充当我稍后可以调用的函数的包装器:
template <typename F, typename... FArgs>
auto make_lambda( F&& f, FArgs&&... f_args )
{
return [&] () -> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
}
Run Code Online (Sandbox Code Playgroud)
我想noexcept在参数f为的时候返回lambda noexcept,所以我的函数返回看起来像这样:
return [&] () noexcept( is_noexcept<decltype( f )>::value )
-> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
Run Code Online (Sandbox Code Playgroud)
我的尝试:
#include <type_traits>
void f() {}
void g() noexcept {}
template <typename F, typename... Args>
struct is_noexcept : std::false_type …Run Code Online (Sandbox Code Playgroud) 我正在实现一些非常类似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数据类型的功能,我可以做什么来使类成为可能.
(当然不是在同一时间)
如何在(例如)STL容器中引入聚合初始化的支持以正确构建它们?我的意思是:
struct A { int i; char c; };
std::list< A > l; // empty
l.insert(std::memberwise, 1, '2');
// <=> l.insert({1, '2'});
Run Code Online (Sandbox Code Playgroud)
std::memberwise是一个可能的标签,就像在STL中已经存在一样std::piecewise_construct,std::allocator_arg等等.
从理论上讲,以这种方式扩展STL容器是否可行?有没有最好的方法("STL-way")来做到这一点?它看起来怎么样?
问题是关于界面设计和(内部)实现的可能性(不是细节).
我确定容器使用::new (static_cast< void * >(pstorage) value_type(std::forward< Args >(args)...);内部的东西.我确定,用括号替换括号会破坏更改.因为非缩小,例如
l.insert({1, '2'});评论中一般提到可能会导致过度移动value_type.很可能这一步将由任何现代编译器优化,但无论哪种方式都有过多的花括号.