ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Возможно ли добавить в язык тип значения которого является типы языка c++?

Open GhostPastR opened this issue 7 months ago • 8 comments

Пример Есть произвольные классы с одинаковыми функциями

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) {

    }
}

Возможно ли добавить в язык такой тип, и создавать переменные с данным типом?

GhostPastR avatar May 20 '25 07:05 GhostPastR