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
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;
};