簡體   English   中英

C ++ 17中帶有參數包的類模板參數推導

[英]Class template argument deduction with a parameter pack in C++17

我試圖在一個類上實現類模板參數推導。 我的類是在類型T (將是數字)上進行模板化的,而構造函數是在std::size_t參數包上進行模板化的。

#include <iostream>
#include <utility>
#include <experimental/array>

template < typename T, std::size_t S>
struct my_array
{               
    template < typename ...SizeTypes>
    my_array( SizeTypes&& ... s ):
    data( std::forward<std::array<std::size_t, S>>( std::experimental::make_array<std::size_t>( std::forward<SizeTypes>(s)... ) ) )
    { 
    }

    T value = T();
    std::array<std::size_t, S> data;
};

template <  typename T, class...Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;

int main()
{   
    my_array<double> a(3, 4, 5);
    a.value = 2.32;
    std::cout << a.value << ", " << a.data[1] << std::endl;
    return 0;
}

我收到以下錯誤:

prog.cc: In function 'int main()':
prog.cc:24:20: error: wrong number of template arguments (1, should be 2)
     my_array<double> a(3, 4, 5);

演示版

關於如何正確實現這一點的任何想法?

T在這里是非推導上下文:

template <  typename T, class... Dimensions>
my_array( Dimensions&& ... )->my_array<T, sizeof...(Dimensions)>;

由於無法推導T ,因此永遠不會選擇此推導指南。 任何隱式指南均不可行。

相反,您應該像標准庫那樣做:

template <class T, class... U>
my_array(T, U...) -> my_array<T, 1 + sizeof...(U)>;

而且,正如之前多次被問到的那樣,這不是問題:

my_array<double> a(3, 4, 5);

您要么推論一切,要么一無所有 因此,這應該是:

my_array<double, 3> a(3, 4, 5); // no deduction
my_array            b(3.0, 4, 5); // full deduction, b is also my_array<double, 3>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM