当前位置: 首页 > 知识库问答 >
问题:

返回C++17可变模板的可变聚合(结构)和语法“构造扣除指南”

毛博
2023-03-14
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();
}

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

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

template<typename Args...>    
many(Args...) -> many<Args...>;

共有1个答案

长孙雅志
2023-03-14

在C++17中,聚合初始化将能够初始化公共基类。所以您可以使用继承+包扩展来构建这样的类。要使其与结构化绑定一起工作,您必须公开元组接口:specializestd::tuple_sizestd::tuple_element,并为您的类提供get函数

//Headers used by "many" class implementation
#include <utility>
#include <tuple>

namespace rw {
    namespace detail {

    template <size_t index, typename T>
    struct many_holder
    { T value; };

    template <typename idx_seq, typename... Types>
    struct many_impl;

    template <size_t... Indices, typename... Types>
    struct many_impl<std::index_sequence<Indices...>, Types...>: many_holder<Indices, Types>...
    {};

    }

template <typename... Types>
struct many: detail::many_impl<typename std::make_index_sequence<sizeof...(Types)>, Types...>
{};

template<size_t N, typename... Types> 
auto get(const rw::many<Types...>& data) -> const std::tuple_element_t<N, rw::many<Types...>>&
{
    const rw::detail::many_holder<N, std::tuple_element_t<N, rw::many<Types...>>>& holder = data;
    return holder.value;
}

}

namespace std {
    template <typename... Types>
    struct tuple_size<rw::many<Types...>> : std::integral_constant<std::size_t, sizeof...(Types)> 
    {};

    template< std::size_t N, class... Types >
    struct tuple_element<N, rw::many<Types...> >
    { using type = typename tuple_element<N, std::tuple<Types...>>::type; };
}

//Headers used for testing
#include <iostream>
#include <string>

int main()
{
    rw::many<int, std::string, int> x = {42, "Hello", 11};
    std::cout << std::tuple_size<decltype(x)>() << '\n' << rw::get<1>(x);
}

演示(现在只适用于CLANG3.9):http://melpon.org/wandbox/permlink/9nbqkcbouurfvypt

备注:

    null
 类似资料:
  • 可变参数模板是接收不同数量参数的模板,可用于可与泛型类型一起运行的模型 法典: 观察:问这个问题的原因是为了理解varidiac模板操作,因此我不关心程序的使用,在上面的示例中:测试类正在失去对生成的子类的访问权(rest…) 问题是: 第一个值得怀疑的话题是:我知道函数和类可以有模板,但模板有什么用呢 疑问的第二个主题:在函数“Print2”中,为什么为Print2调用推导的模板是 怀疑的第三个

  • 考虑以下代码: 失败的行在G7下返回以下错误: 这是正常的还是编译器错误?

  • 请考虑以下定义和演绎指南: 如果我尝试使用显式模板参数实例化 ,代码将正确编译: 如果我试图通过演绎指南实例化< code>foo... > G7产生编译器错误: clang 5 爆炸: wandbox上的实例 虽然clang肯定被窃听了(报告为问题#32673),但g拒绝我的代码是正确的吗?我的代码格式错误吗?

  • 以这种方式传递参数有问题,我得到以下错误:“std::thread::thread”:没有重载函数接受4个参数。我怎么能这么做?

  • 我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。 我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下: 但是,会引发此错误(为了可读性,缩短为):

  • C 语言与大多数计算机语言一样是按照语句的顺序逐条执行的。如同流水一样,从上到下顺序执行。这就如同我们每天的日常生活,对于上班族来说,就是起床,洗漱,吃早饭,上班,午饭。下班,晚饭,睡觉。感觉一切都平淡无奇。但是如果你想去购买一台电脑怎么办?这不是一件每天都发生的流水事件,而且你需要在有足够的钱的情况下才能购买。这个时候,你就要在满足有钱的条件下打破原有的生活顺序,去卖场购买一台电脑。这就是生活中