簡體   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