我正在嘗試創建一個將 anstd::array作為模板引數的類模板。目前,宣告如下:
template<typename T, std::size_t N, std::array<std::size_t, N> A>
class Foo {
...
}
然而,這是非常不幸的,因為我通常會A使用初始化串列進行初始化,這使得需要指定N乏味和冗余:
// Current
Foo<int, 3, {5, 3, 4}> bar;
// Preferred
Foo<int, {5, 3, 4}> baz;
我試圖使用類似于模板模板引數的東西無濟于事:
template<typename T, template<std::size_t N> std::array<std::size_t, N> A>
有沒有辦法完成我想要做的事情,或者N通過將它A放在引數串列中來“隱藏” ?
uj5u.com熱心網友回復:
您也許可以使用 c 20auto模板引數:
template<typename T, auto A>
使用 Boost 對型別進行解碼的現場演示:
實時編譯器資源管理器
#include <array>
#include <boost/core/demangle.hpp>
#include <iostream>
template<typename T, auto A>
struct Foo {
void bar() const {
std::cout << boost::core::demangle(typeid(decltype(A)).name()) << "\n";
}
};
int main() {
Foo<int, std::array{3,4,7}> f;
Foo<int, std::array{'a', 'b'}> g;
f.bar();
g.bar();
}
印刷
std::array<int, 3ul>
std::array<char, 2ul>
可變引數包
否則我建議只將陣列元素作為一個包傳遞:
template<typename T, auto... A>
在線觀看(C 17)
#include <type_traits>
#include <iostream>
template<typename T, auto...>
struct Foo {
void bar() const {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
int main() {
Foo<int, 3,4,7> f;
Foo<int, 'a', 'b'> g;
f.bar();
g.bar();
}
印刷
void Foo<T, <anonymous> >::bar() const [with T = int; auto ...<anonymous> = {3, 4, 7}]
void Foo<T, <anonymous> >::bar() const [with T = int; auto ...<anonymous> = {'a', 'b'}]
uj5u.com熱心網友回復:
可以選擇添加包裝器,因此以下代碼將起作用:
Foo2<as_std_array<5, 3, 4>> baz2;
與as_std_array被定義為:
template<auto item, auto... items>
struct as_std_array {
using TYPE = std::common_type_t<decltype(item), decltype(items)...>;
constexpr static std::size_t SIZE = sizeof...(items) 1;
constexpr static auto ARRAY = std::array<decltype(item), SIZE>{item, items...};
};
和Foo,Foo2為:
template<std::size_t N, typename T, std::array<T, N> A>
struct Foo {
constexpr static auto ARRAY = A;
};
template<typename T>
class Foo2: public Foo<T::SIZE, typename T::TYPE, T::ARRAY>{};
然后以下作業:
Foo2<as_std_array<5, 3, 4>> baz2;
static_assert(baz2.ARRAY == std::array{5, 3, 4});
代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353732.html
下一篇:將Python腳本轉換為C
