簡體   English   中英

C++20:參數包部分展開

[英]C++20 : Parameter pack partial expansion

我需要一種方法來部分擴展參數包。 子集的大小必須由另一個可變參數確定。 使用示例代碼會更清楚我的意思。


struct EntityA {
    EntityA(int, char, unsigned) {}
    EntityA(int, char, unsigned*) {}
    EntityA(int, char*, unsigned*) {}
    EntityA(int*, char*, unsigned*) {}
}
// various types of entities
// ...

// Service provides Args. 
template <typename ... Args>
struct Service {
    // returns provided Args
    template <typename T>
    T get() { return T{}; }
};

// this function should call appropriate overload of E by looking at sizeof...(pArgs)
template <typename E, typename ... SArgs>
E
construct(Service<SArgs ...>& service, auto&& ... pArgs) {
    // somehow i need to expand and get first half from service and get others from parameters
    return E{service.get<SArgs> ..., std::forward<decltype(pArgs)>(pArgs) ...};
}


int main() {
    Service<int, char, unsigned> service;
    construct<EntityA>(service);
    construct<EntityA>(service, (unsigned*)nullptr);
    construct<EntityA>(service, (char*)nullptr, (unsigned*)nullptr);
    construct<EntityA>(service, (int*)nullptr, (char*)nullptr, (unsigned*)nullptr);

    return 0;
}

一些對象(模板參數 E)需要使用部分來自服務和部分來自客戶端代碼的參數來構造。 有沒有辦法實現這個?

您可以為此使用std::index_sequence

template <typename E, typename ... SArgs, typename ... PArgs> 
E construct(Service<SArgs...>& service, PArgs&& ... pargs) {
    constexpr auto size = sizeof...(PArgs);
    constexpr auto missing_size = 3 - size; // note: you need to somehow know the parameter count
    using default_types = std::tuple<SArgs...>;

    return [&]<std::size_t ...I>(std::index_sequence<I...>){
            return E{
                service.template get<std::tuple_element_t<I,default_types>>()...,
                std::forward<PArgs>(pargs)...
            };
        }(std::make_index_sequence<missing_size>());
}

https://godbolt.org/z/PY4hYrqK7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM