xyxykingyo 2023-04-10 18:35 采纳率: 20%
浏览 18

C++怎么通过函数得到元祖的成员类型

class baseClassA {
}

template <typename Input, typename Output>
class B: baseClassA {
  
}

class C {
  public:
    template <typename N, typename... Args>
    auto create_classA {
      auto member = std::make_unique<N>(std::forward<Args>(args)...);  
      members.push_back(std::move(member));
      ...
    }
    auto get_member(int index) -> A* {}
     // index1和index2用来获取A*
     // slot用于表示一个tuple的位置类型
    auto compare(int index1, int index2, int slot) -> void() {}
  private:
    std::vector<std::unique_ptr<node>> members;
}

已知在main函数中我们定义了:

my_classB1: B<int, double> {}
my_classB2: B<std::tuple<int, double, int>, double>> {}

auto a1 = classC.create_classA()
auto a2 = classC.create_classA()

我的问题是:
如何能在classC这个compare函数中,比较a1的output的类型(double)存在于a2的input(std::tuple<int, double, int>)中?
也就是说如果我用compare函数:
compare(0, 1, 1) -> 这个会抛出异常,因为a2的元祖第一个元素类型是int,而a1的output类型是double
compare(0, 1, 2) -> 这个会是正常的,因为a2的元祖第二个元素类型是double,而a1的output类型也是double
compare(0, 1, 3) -> 这个会抛出异常,因为a2的元祖第二个元素类型是double,而a1的output类型也是double
谢谢大家

  • 写回答

1条回答 默认 最新

  • threenewbee 2023-04-10 18:56
    关注

    这个要用到模板元编程了,因为c++缺乏java那样的反射机制去做 rtti

    
    #include <iostream>
    #include <tuple>
    #include <type_traits>
    
    template <typename T, typename U>
    struct is_member_of;
    
    template <typename T, typename... Args>
    struct is_member_of<T, std::tuple<Args...>> {
      static constexpr bool value = (std::is_same_v<T, Args> || ...);
    };
    
    template <typename Input, typename Output>
    class B : public baseClassA {};
    
    class C {
     public:
      template <typename N, typename... Args>
      auto create_classA(Args&&... args) {
        auto member = std::make_unique<N>(std::forward<Args>(args)...);
        members.push_back(std::move(member));
      }
    
      auto get_member(int index) -> B<Input, Output>* {}
    
      auto compare(int index1, int index2, int slot) -> void() {
        auto a1 = dynamic_cast<B<Input, Output>*>(get_member(index1));
        auto a2 = dynamic_cast<B<std::tuple<Input...>, std::tuple<Output...>>*>(
            get_member(index2));
    
        if (!a1 || !a2) {
          throw std::runtime_error("Invalid member type");
        }
    
        if (!is_member_of<Output, std::tuple_element_t<slot, Input>>::value) {
          throw std::runtime_error("Output type not found in input tuple");
        }
      }
    
     private:
      std::vector<std::unique_ptr<baseClassA>> members;
    };
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月10日

悬赏问题

  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。
  • ¥15 GitHubssh虚拟机连接不上
  • ¥15 装完kali之后下载Google输入法 重启电脑后出现以下状况 且退不出去 桌面消失 反复重启没用