[英]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.