相关疑难解决方法(0)

返回C++ 17可变参数模板'构造演绎指南'的可变参数聚合(结构)和语法

使用many如下所示的模板结构,可以返回一组固定的可能不可移动的对象,并使用c ++ 17结构化绑定接收它们(auto [a,b,c] = f();声明变量ab和c并从f返回它们的值,例如结构或元组).

template<typename T1,typename T2,typename T3>
struct many {
  T1 a;
  T2 b;
  T3 c;
};

// guide:
template<class T1, class T2, class T3>
many(T1, T2, T3) -> many<T1, T2, T3>;

auto f(){ return many{string(),5.7, unmovable()}; }; 

int main(){
   auto [x,y,z] = f();
}
Run Code Online (Sandbox Code Playgroud)

正如在这两个问题和答案中所解释的那样(Do std :: tuple和std :: pair是否支持聚合初始化? 特别是ecatmur接受的答案,还有多个返回值(结构化绑定)和不可移动的类型以及C++中保证的RVO 17),std::tuple不支持聚合初始化.这意味着它不能用于保存和返回不可移动的类型.但是一个简单的结构many可以做到这一点,这导致了一个问题:

是否可以创建一个many可以使用任意数量参数的可变版本?

更新:在模板版本中many,是否允许使用以下指南语法?

template<typename Args...>    
many(Args...) -> many<Args...>;
Run Code Online (Sandbox Code Playgroud)

c++ templates c++17

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

对数时间内聚合的数量

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

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

#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
查看次数

标签 统计

c++ ×2

aggregate ×1

c++11 ×1

c++14 ×1

c++17 ×1

templates ×1

type-traits ×1