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

class baseClassA {
}

template 
class B: baseClassA {
  
}

class C {
  public:
    template 
    auto create_classA {
      auto member = std::make_unique(std::forward(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> members;
}

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

my_classB1: B {}
my_classB2: B, double>> {}

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

我的问题是:
如何能在classC这个compare函数中,比较a1的output的类型(double)存在于a2的input(std::tuple)中?
也就是说如果我用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
谢谢大家

这个要用到模板元编程了,因为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;
};