8000 Возможно ли добавить в язык тип значения которого является типы языка c++? · Issue #615 · cpp-ru/ideas · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Возможно ли добавить в язык тип значения которого является типы языка c++? #615
Open
@GhostPastR

Description

@GhostPastR

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

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0