Open
Description
Пример
Есть произвольные классы с одинаковыми функциями
class A{
public:
void print() const{
std::cout << "print - A" << std::endl;
}
};
class B{
public:
void print() const{
std::cout << "print - B" << std::endl;
}
};
class C{
public:
void print() const{
std::cout << "print - C" << std::endl;
}
};
Хочется их поместить в какую-нибудь обёртку
struct Wraperr{
Wraperr(auto data);
void print() const;
private:
std::any data_;
};
И использовать контейнер для вызова общих функций
int main(){
std::vector<Wraperr> temp;
temp.push_back(A());
temp.push_back(B());
temp.push_back(C());
for(const auto &i : temp){
i.print();
}
return 0;
}
Сейчас не обходимо для класса Wraperr писать такой код
template <typename ...Args>
struct Base{
std::tuple<std::optional<Args>...> tuple;
void set_object(auto object){
std::apply([&object, this](auto&&... args) {(this->set_obj(args, object), ...);}, tuple);
}
void set_obj(auto&& item, auto object){
item = std::nullopt;
if constexpr(std::is_same_v<typename std::remove_reference<decltype(item)>::type, std::optional<decltype(object)>>){
item = object;
}
};
};
using Collection = Base<A, B, C>;
Wraperr::Wraperr(auto data){
Collection base;
base.set_object(data);
data_ = base;
}
#define IF_TUPLE(INDEX, FUNCTION) \
if(auto opt = std::get<INDEX>(base.tuple); opt.has_value()){ \
opt->FUNCTION(); \
return; \
} \
void Wraperr::print() const{
const auto &base = std::any_cast<Collection>(data_);
IF_TUPLE(0, print)
IF_TUPLE(1, print)
IF_TUPLE(2, print)
throw std::bad_any_cast();
}
В данном случаи не хватает нового типа, значение которого могут быть типы в с++.
Пример:
<type> value = int; //<type> - некий новый тип
В итоге Wraperr будет выглядеть следующим образом.
struct Wraperr{
Wraperr(auto data);
void print() const;
private:
std::any data_;
<type> type_object_;
};
Wraperr::Wraperr(auto data){
data_ = data;
type_object_ = decltype(data);
}
void Wraperr::print() const{
try {
std::any_cast<type_object_>(data_).print();
} catch (const std::bad_any_cast &e) {
}
}
Возможно ли добавить в язык такой тип, и создавать переменные с данным типом?
Metadata
Metadata
Assignees
Labels
No labels