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

两个参数包C之间的通用类型

傅玮
2023-03-14

我需要定义返回类型(????在代码中)在一个带有2个参数包的和之后!我的目标是定义一个Tuple类(如std::tuple)并实现例如在这里,相同长度和兼容类型的两个元组之间的加法),这里是一个代码片段来理解:

 template<class FirstType, class ... Types>
 class Tuple{
 ....
 template <typename ... OtherTypes>
 const Tuple<????> operator+(Tuple<OtherTypes...>& other) const{...}
 ... 
 }

问题是“int double”应该返回一个double,例如!我看了std::common_类型的一面,但我也看不到。元组的构造如下:

private:
        FirstType m_first ;
        Tuple<Types...> m_next ;

m_first包含该值,并且,m_next通过删除一个值来包含下一个元组。

这是我存储不同类型的方法,尽管还有另一种继承方法。我有另一个带有递归案例模板的类。

所以我不知道如何获取最终的返回类型,我有一个get函数,在这里我使用了一个getHelper

提前感谢您的回答。

示例:Tuple

共有1个答案

柳镜
2023-03-14

看这里如何elementwise添加两个元组https://stackoverflow.com/a/50815600/4117728.以下建立在这个答案上。剩下要添加的只是获取公共类型元组:

template <typename T1,typename T2>
struct common_tuple;

template <typename...T1,typename...T2>
struct common_tuple< std::tuple<T1...>,std::tuple<T2...>> {
    using type = std::tuple<std::common_type_t<T1,T2>...>;
};

那么上面链接的答案可以调整为:

namespace internal
{    
    template<typename T,typename S, size_t... Is>
    common_tuple<T,S>::type add_rhs_to_lhs(T& t1, const S& t2, std::integer_sequence<size_t, Is...>)
    {
        return std::make_tuple( (std::get<Is>(t1) + std::get<Is>(t2))... );      
    }
}

template <typename...T,typename...S>
std::tuple<std::common_type_t<T,S>...> operator + (std::tuple<T...> lhs, const std::tuple<S...>& rhs)
{
   return internal::add_rhs_to_lhs(lhs, rhs, std::index_sequence_for<T...>{});
}


int main(int argc, char *argv[])
{
    auto a = std::make_tuple(1,2,4);
    auto b = std::make_tuple(1.0,2.0,4.0);
    auto c = a + b;
    std::cout << std::get<0>(c) << "\n";
    std::cout << std::get<1>(c) << "\n";
    std::cout << std::get<2>(c) << "\n";
}

但是,ab已经生成了通用类型,因此您可以简单地使用auto

#include <tuple>
#include <iostream>


namespace internal
{    
    template<typename T,typename S, size_t... Is>
    auto add_rhs_to_lhs(T& t1, const S& t2, std::integer_sequence<size_t, Is...>)
    {
        return std::make_tuple( (std::get<Is>(t1) + std::get<Is>(t2))... );      
    }
}

template <typename...T,typename...S>
auto operator + (std::tuple<T...> lhs, const std::tuple<S...>& rhs)
{
   return internal::add_rhs_to_lhs(lhs, rhs, std::index_sequence_for<T...>{});
}


int main(int argc, char *argv[])
{
    auto a = std::make_tuple(1,2,4);
    auto b = std::make_tuple(1.0,2.0,4.0);
    auto c = a + b;
    std::cout << std::get<0>(c) << "\n";
    std::cout << std::get<1>(c) << "\n";
    std::cout << std::get<2>(c) << "\n";
}
 类似资料:
  • 有人能解释一下这两种方法的区别吗?它们是一样的吗?在我看来,它们解决的问题是一样的。如果它们相同,为什么需要<代码> ? 方法#1,无界 方法#2,无界: 方法#1,有界 方法#2,有界:

  • 编辑:哈哈,我从没想过你们会这么野蛮。我想这是一个大学生来寻找答案的好地方。如果我不在乎,为什么我会在这里。。基本上,我的问题与其他问题不同,因为我确实需要第一个循环来陈述我的偶数,即:1012146181820。我真诚地希望我能得到一些关于如何在第二个循环中恢复firstNum的原始值的反馈,而不是期望在几秒钟内被选为分数答案的批评。 我已经实现了一个代码,我在论坛上的一个非常相似的问题中看到了

  • 问题内容: 方法论问题: 我有一个“主” python脚本,该脚本在系统上无限循环地运行,并且我想偶尔与其他一些python脚本一起向其发送信息(例如,json数据字符串),这些脚本稍后将由本人或另一个程序启动并且将在发送字符串后立即结束。 我不能在这里使用子流程,因为我的主脚本不知道其他脚本何时运行以及它们将执行什么代码。 我正在考虑使主脚本在本地端口上侦听,并使其他脚本在该端口上向它发送字符串

  • 我有一个Minecraft服务器,它被配置为根据游戏中发生的事件更改我的LED灯条的颜色,但是,此服务器仅在我的计算机上运行时才起作用。这是因为它需要使用Arduino来控制LED灯条。 我想知道是否有任何方法可以通过两个不同的jar文件进行通信,这样当Minecraft中发生事件时,它就会通过一个完全不同的文件告诉我的计算机。 例如:我使用像Server.pro这样的《我的世界》服务器托管商。每

  • 我有一个java类来处理XLS文件,并使用apache poi jar(poi-ooxml-3.8-20120326.jar)来完成。我最近还部署了BIRT jar来生成一些报告。接下来,当我调用java类进行XLS处理时,得到以下错误。 我发现'WorkbookFactory'类也在BIRT相关的jar(org.eclipse.birt.runtime_4.2.1.v20120918-1113.

  • 问题内容: 有人可以解释一下这两种方法之间的区别吗?都一样吗 就解决方案而言,它们在我看来确实相同。如果它们相同,为什么需要? 方法1,无界 方法2,无界: 方法1,有界 方法2,有界: 问题答案: 它们相同,因为它们接受相同的参数类型。 但是,使用(或其他任何一种)标识类型可以让您在其他地方引用该类型。 编辑:示例: 您无限制的示例未充分利用参数化类型的功能。你有: 这对于打印字符串表示的示例就