相关疑难解决方法(0)

如何检测模板参数是否为noexcept函数?

我有生成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)

c++ templates c++11 c++14

10
推荐指数
2
解决办法
1224
查看次数

sfinae远离析构函数

我正在实现一些非常类似std::vector但在堆栈上使用数组而不是内存分配的东西.

d-tor调用使用SFINAE的函数.

  • 如果value_type是POD功能有空体.
  • 如果value_type是正常类std::string,则函数有一个正文并正确销毁所有数据.

现在,我希望能够使用这个新std::vectorconstexpr.然而,即使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数据类型的功能,我可以做什么来使类成为可能.
(当然不是在同一时间)

c++ sfinae constexpr c++14

6
推荐指数
1
解决办法
525
查看次数

如何将聚合支持到STL或类似STL的库中

如何在(例如)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.很可能这一步将由任何现代编译器优化,但无论哪种方式都有过多的花括号.

c++ containers stl aggregate c++17

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

标签 统计

c++ ×3

c++14 ×2

aggregate ×1

c++11 ×1

c++17 ×1

constexpr ×1

containers ×1

sfinae ×1

stl ×1

templates ×1