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;
};