繁体   English   中英

C++17 部分推导指南

[英]C++17 Partial Deduction Guide

我正在尝试编写一个推导指南,该指南仅从给定的构造函数参数中检测到许多类型名中的一个,并要求用户手动输入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);

所以基本上,我希望从给定的initialStateVector推导出上面的“ int ”,它具有类型

const vector<int>& raw_values

上面的想法是仍然应该强制用户输入模板的“int size”参数,但是应该从构造函数的参数中推导出“typename T”,这可能吗?

根据此 cppreference 页面中的注释(以及以下示例)

仅当不存在模板参数列表时才执行类模板参数推导。 如果指定了模板参数列表,则不会进行推导。

不,这是不可能的(不是在 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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM