簡體   English   中英

將可變參數模板參數解壓縮到初始化列表中

[英]Unpacking variadic template parameters into initializer list

我目前正在嘗試實現一般的初始化程序來減少代碼庫的大小。 但有一次,我的代碼看起來像這樣:

template<typename T, typename Arg1, typename Arg2>
T* ManageDevice(Arg1 arg1, Arg2 arg2)
{
    auto device = new T{ arg1, arg2 };
    // More operations on device
    return device;
}

template<typename T, typename Arg1, typename Arg2, typename Arg3>
T* ManageDevice(Arg1 arg1, Arg2 arg2, Arg3 arg3)
{
    auto device = new T{ arg1, arg2, arg3 };
    // More operations on device
    return device;
}

template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
T* ManageDevice(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
{
    auto device = new T{ arg1, arg2, arg3, arg4 };
    // More operations on device
    return device;
}

哪個開始不那么優雅。 根據我的理解,可變參數模板似乎是解決此問題的方法。 但我不明白這是如何適用於我的情況。

我更喜歡這樣的東西:

T* ManageDevice(Args... args)
{
    // The function I want
    // Unpack as a std::initializer_list
    auto allArguments = unpackAll(); 

    auto device = new T{ allArguments };
    // More operations on device
    return device;
}

關於如何實現unpackAll()的任何建議? 謝謝。

auto device = new T{ allArguments };

只是需要

auto device = new T{ args... };

T{ args... } args...會將參數包擴展為arg0, arg1, ..., argn

你可以看到這個

template <typename... Args>
std::vector<int> make_vector(Args... args)
{
    return {args...};
}

int main()
{
    auto foo = make_vector(1,2,3,4);
    for (auto e : foo)
        std::cout << e << " ";
}

編輯以添加完美的轉發版本

template <typename... Args>
std::vector<int> make_vector(Args&&... args)
{
    return {std::forward<Args>(args)...};
}

我的C ++ 14回答,作為一個最小的工作示例

#include <initializer_list>
#include <utility>
#include <vector>
#include <type_traits>
#include <iostream>

struct example {
    template <typename ...Args, typename T = std::common_type_t<Args...>>
    static std::vector<T> foo(Args&& ...args) {
        std::initializer_list<T> li{std::forward<Args>(args)...};
        std::vector<T> res{li};
        return res;
    }
};

int main() {
    std::vector<int> v1 = example::foo(1,2,3,4);
    for(const auto& elem: v1)
        std::cout << elem << " ";
    std::cout << "\n";
}

你需要根據自己的需要編輯這個,這是你的代碼結構。 但請注意, vector構造函數采用initializer_list ,該列表是從靜態foo方法中的參數包生成的。

編輯:在您的情況下,正如其他人所說,您可以直接將參數包轉發給您的電話。 我的答案顯示將它們傳遞給initializer_list

事實上,你可以做到

static std::vector<T> foo(Args&& ...args) {
    std::vector<T> res{std::forward<Args>(args)...};
    return res;
}

這些參數將被隱式轉換為initializer_list 我明確地從參數包中顯示了initializer_list的構造。

暫無
暫無

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

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