我正在尋找一種僅使用本機 C 語言功能(最高 C 17)來完成以下任務的解決方案:
std::array<Type, unsigned int Elem> array_{Type(), // 1 - Call constructor on Type()
Type(), // 2 - ...
... , // 3 - ...
Type()} // Elems - Call the Elem:th Type() constructor
此外,我還希望每個建構式呼叫都應該能夠接受任意數量的引數。
一個具體的例子是自動撰寫以下內容:
std::array<std::shared_ptr<int>, 4> array_{std::make_shared<int>(),
std::make_shared<int>(),
std::make_shared<int>(),
std::make_shared<int>()}
即,假設我知道 Type 和 Elem,我想自動化創建大括號括起來的初始值設定項串列的程序,并在程序中呼叫 Type:s 建構式。
有任何想法嗎?
更新,我想解決的真正問題如下:
template <typename Type, unsigned int Size>
class Storage {
public:
Storage(std::initializer_list<Type> initializer) : array_{initializer} {}
private:
std::array<Type, Size> array_;
};
void foo(){
Storage<std::shared_ptr<int>, 100> storage(...);
// or perhaps
auto storage = std::make_shared<Storage<std::shared_ptr<int>, 100>>(here be an initializer list containing calls to 100 std::make_shared<int>());
}
uj5u.com熱心網友回復:
像這樣:
#include <array>
#include <memory>
#include <utility>
template <std::size_t ...I>
std::array<std::shared_ptr<int>, sizeof...(I)> foo(std::index_sequence<I...>)
{
return {(void(I), std::make_shared<int>())...};
}
std::array<std::shared_ptr<int>, 4> array_ = foo(std::make_index_sequence<4>());
來自 C 17 的保證復制省略確保陣列在適當的位置構造,并且不會發生額外的移動。
return 陳述句擴展為{(void(0), std::make_shared<int>()), (void(1), std::make_shared<int>())...}。void(...)不是絕對必要的,但 Clang 會發出警告,否則。
但如果是我的代碼,我會寫一個更通用的幫助器:
#include <utility>
template <typename R, typename N, typename F, N ...I>
[[nodiscard]] R GenerateForEach(std::integer_sequence<N, I...>, F &&func)
{
return {(void(I), func(std::integral_constant<N, I>{}))...};
}
template <typename R, auto N, typename F>
[[nodiscard]] R Generate(F &&func)
{
return (GenerateForEach<R, decltype(N)>)(std::make_integer_sequence<decltype(N), N>{}, std::forward<F>(func));
}
然后:
auto array_ = Generate<std::array<std::shared_ptr<int>, 4>, 4>([](auto){return std::make_shared<int>();});
雖然在這種情況下 lambda 會丟棄索引,但它通常最終還是有用的,尤其是考慮到 in[](auto index){...}是index.valueconstexpr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441482.html
上一篇:在C 中查找序列的基期
