可以說我有一個看起來像這樣的課程
template<int n>
class A{
array<size_t, n> sizes;
//...
public:
template <int k>
A<k> reshape(array<size_t, k> new_sizes){
return A<k>(new_sizes):
}
};
它可以作業,但引數new_sizes在語法上是次優的,因為我必須這樣稱呼它:
foo.reshape(array<size_t, 3>{1,2,3});
這不起作用:
foo.reshape({1,2,3});
有沒有一種方法可以定義initializer_list帶有編譯時大小的a(所以我可以使用它而不是陣列)或者(甚至更好)一種定義可變引數大小的方法,所以我可以撰寫類似的東西
foo.reshape(1,2,3);
uj5u.com熱心網友回復:
或者(甚至更好)一種定義可變引數大小的方法,所以我可以寫類似的東西
foo.reshape(1,2,3);
您可以采用sizeof...a 引數包:
template <size_t N>
class A {
std::array<size_t, N> sizes;
public:
A() = default;
template <class... Args>
A(Args&&... ss) : sizes{static_cast<size_t>(ss)...} {}
template <class... Args>
A<sizeof...(Args)> reshape(Args&&... new_sizes) {
// ^^^^^^^^^^^^^^^
return A<sizeof...(Args)>(static_cast<size_t>(new_sizes)...);
}
};
// deduction guide:
template <class... Args>
A(Args&&...) -> A<sizeof...(Args)>;
演示
uj5u.com熱心網友回復:
{1, 2, 3}沒有型別但可以推斷為initializer_list<T>或T[N]
所以為了保持你的語法,它將是:
template <std::size_t K>
A<K> reshape(/*const*/ size_t (&new_sizes)[K])
{
return A<K>(new_sizes):
}
所以我可以寫類似的東西
foo.reshape(1,2,3);
對于該可變引數模板:
template <typename... Ts>
A<sizeof...Ts> reshape(Ts... elems)
{
return reshape({elems...}); // using above method
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515142.html
標籤:C 模板
