C++17 部分扣除指南
C++17 Partial Deduction Guide
本文关键字:C++17 更新时间:2023-10-16
我正在尝试编写一个演绎指南,它只检测给定构造函数参数中的许多 typename 之一,并要求用户手动输入int
size
template <int size, typename T>
struct Board
{
array<array<T, size>, size> values;
explicit Board(const vector<T>& raw_values){
}
};
template <int size, typename T> Board(const vector<T>&) -> Board<int size, T>;
上面的想法是用户仍然应该被迫输入模板的"int size
"参数,但"typename T
"应该从构造函数的参数中推导出来,这可能吗?
在正确的规范之后,这就是方法应该如何调用
auto b = Board<3>(initialStateVector);
目前,它需要我像这样输入;
auto b = Board<3, int>(initialStateVector);
所以基本上,我希望上面的"int
"是从给定的initialStateVector
推导出来的,它具有类型
const vector<int>& raw_values
上面的想法是用户仍然应该被迫输入模板的"int size"参数,但"typename T"应该从构造函数的参数中推导出来,这可能吗?
根据此 cpp首选项页面中的注释(以及以下示例(
仅当不存在模板参数列表时,才会执行类模板参数推导。如果指定了模板参数列表,则不会进行扣除。
不,这是不可能的(不是在C++17中;我们希望在标准的未来版本中(。
如果你想显式大小并让推断类型,我能想象的最好的就是通过一个古老的make_something函数。
我的意思如下(使用 std::size_t
作为大小,如 std::array
和几乎所有 STL(
template <std::size_t S, typename T>
Board<S, T> make_Board (std::vector<T> const & v)
{ return {v}; }
// ...
auto b = make_Board<3>(initialStateVector);
这应该也适用于 C++11。
我想出了一个使用大小提示对象的解决方法
template<int size>
struct SizeHint {};
您的类会将此作为附加构造函数参数:
Board(SizeHint<size>, const std::vector<T>& raw_values)
你像这样调用构造函数:
auto b = Board(SizeHint<2>{}, v);
<小时 />奖金
这种方法也适用于类型提示(我最初的动机是我如何找到这个线程(:
template<typename T>
struct TypeHint{};
template<typename Result, typename T>
struct S {
S(TypeHint<Result>, T arg) : t{arg}{}
Result r() {return t;}
T t;
};
#include <iostream>
int main() {
S s{TypeHint<int>{}, 5.7};
std::cout << s.r() << std::endl;
}
这也可以与可变参数模板结合使用:
template<typename Result, typename... Args>
struct S {
S(TypeHint<Result>, Args... args) : t{args...}{}
std::tuple<Args...> t;
};
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何在c++17中制作一个模板包装器/装饰器
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- C++17中的并行执行策略
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 并行用于C++17中数组索引范围内的循环
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在C++17中,引用const字符串的语义应该是什么
- 为什么这种直接初始化有效?(C++17)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 为什么 C++17 中没有 std::construct_at?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17 文件系统::remove_all 带有通配符路径
- 如何在 C++17 STL 并行算法中处理调度?
- 容器,其中每个项可以有多个非唯一键 (c++17)