Các mã sauC++ template variadic với đôi
#include <initializer_list>
#include <vector>
template<int ...>
const std::vector<int>*make_from_ints(int args...)
{ return new std::vector<int>(std::initializer_list<int>{args}); }
được biên dịch (với GCC 6.3, trên Debian/Sid/x86-64) một cách chính xác, và tôi hy vọng nó cho một cuộc gọi như
auto vec = make_from_ints(1,2,3);
để trả lại con trỏ về một số vectơ có số nguyên 1, 2, 3.
Tuy nhiên, nếu tôi thay thế int
bằng double
, đó là nếu tôi thêm thông tin sau (trong cùng một)tập tin ...) mã:
template<double ...>
const std::vector<double>*make_from_doubles(double args...)
{ return new std::vector<double>(std::initializer_list<double>{args}); }
Tôi nhận được một lỗi biên dịch:
basiletemplates.cc:8:17: error: ‘double’ is not a valid type
for a template non-type parameter
template<double ...>
^~~
và tôi không hiểu tại sao. Sau khi cả hai số int
và double
là các loại POD số vô hướng (được xác định trước trong tiêu chuẩn C++ 11).
Làm thế nào để có được một chức năng variadic mẫu để có thể mã:
auto dvec = make_from_doubles(-1.0, 2.0, 4.0);
và có được một con trỏ đến một số vector của đôi chứa -1.0, 2.0, 4.0?
BTW, biên dịch cho C++ 14 (với g++ -Wall -std=c++14 -c basiletemplates.cc
) và sử dụng clang++
(phiên bản 3.8.1) thay vì g++
không thay đổi bất kỳ điều gì.
'int args ... 'được phân tách là' args int, ... ', định nghĩa của mẫu của bạn chỉ đơn giản là sai –