矩阵的演绎指南
deduction guides for matrix
本文关键字:演绎 更新时间:2023-10-16
我正在寻找初始化矩阵的演绎指南。
我尝试在包中使用包和sizeof...
,initializer_list<initializer_list<T>>
,自定义类用于构造的数组,但没有任何效果......
所以,我正在寻找初始化
template <class T, size_t s1, size_t s2>
class matrix
{
T matr[s1][s2]; //maybe with custom array class, if this problem need this
public:
//constructor
};
//deductor
喜欢
matrix m{{1, 2}, {1, 2}};
或
matrix m({1, 2}, {1, 2});
也许...如果您可以接受在变量结构中添加另一级别的括号......
matrix m{{{1, 2}, {1, 2}}};
// ......^..............^ another level
您可以在接收数组matrix
构造,因此会自动推导T
、s1
和s2
template <typename T, std::size_t s1, std::size_t s2>
class matrix
{
using ca1 = T const [s1];
using ca2 = ca1 const [s2];
T matr[s1][s2];
public:
matrix (ca2 & arr2d)
{
for ( auto ui = 0u ; ui < s1 ; ++ui )
for ( auto uj = 0u ; uj < s2 ; ++uj )
matr[ui][uj] = arr2d[ui][uj];
}
};
以下是完整的编译示例
#include <iostream>
template <typename T, std::size_t s1, std::size_t s2>
class matrix
{
using ca1 = T const [s1];
using ca2 = ca1 const [s2];
T matr[s1][s2];
public:
matrix (ca2 & arr2d)
{
for ( auto ui = 0u ; ui < s1 ; ++ui )
for ( auto uj = 0u ; uj < s2 ; ++uj )
matr[ui][uj] = arr2d[ui][uj];
}
};
int main()
{
matrix m{{{1, 2}, {1, 2}, {1, 2}}};
}
我已经找到了避免额外括号的方法。
这个时间还需要明确的演绎指南,SFINAE和初始化matr
成员的附加方法,但应该有效。
以下是完整的完整示例
#include <iostream>
template <typename T, std::size_t s1, std::size_t s2>
class matrix
{
private:
T matr[s1][s2];
void init_row (std::size_t i, T const (&arr)[s2])
{
for ( auto j = 0u ; j < s2 ; ++j )
matr[i][j] = arr[j];
}
public:
template <std::size_t ... Dims,
std::enable_if_t<sizeof...(Dims) == s1, bool> = true,
std::enable_if_t<((Dims == s2) && ...), bool> = true>
matrix (T const (&...arrs)[Dims])
{ std::size_t i = -1; (init_row(++i, arrs), ...); }
};
template <typename T, std::size_t Dim0, std::size_t ... Dims,
std::enable_if_t<((Dim0 == Dims) && ...), bool> = true>
matrix (T const (&)[Dim0], T const (&...arrs)[Dims])
-> matrix<T, 1u+sizeof...(Dims), Dim0>;
int main()
{
matrix m{{1, 2}, {1, 2}, {1, 2}};
static_assert( std::is_same_v<decltype(m), matrix<int, 3u, 2u>> );
}
相关文章:
- 模板模板参数的演绎指南
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 演绎指南中的参考文献和值之间的差异
- 为什么 std::array 的演绎指南不允许不同的类型?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 矩阵的演绎指南
- C++17类模板演绎常性
- C++17模板演绎指南不用于空参数集?
- 如何使用模板化构造函数定义演绎指南?
- 为什么"packaged_task"没有演绎指南?
- 类型演绎 C++ 标准和自动
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- λ类型演绎失败
- SFINAE使用演绎,但用替换失败
- 演绎指南和具有可变参数模板构造函数的可变参数类模板 - 参数包长度不匹配
- decltype(auto) 类型演绎:返回 x 与返回 (x)
- 可变参数模板构造函数的演绎指南失败
- 演绎指南可以有一个显式(布尔)说明符吗?