2016-09-27 18 views
8

Với tính năng sắp tới C++ 17 của non-type template arguments with auto, nó sẽ có thể để thực hiện std::function trong một cách nào đó để có thể đặt, ví dụ, các chức năng sau:Đối số mẫu C++ 17 có tính năng tự động cho phép std :: đối tượng hàm bị hạn chế không?

bool f(int n, double d) {}  
    bool g(bool b, char c) {} 
    bool h(bool b)   {} 

vào auto-templated std::function các đối tượng:

std::function<bool(auto, auto)> faa = f; // ok 
    std::function<bool(int, auto)> fia = f; // ok 
    std::function<bool(double, auto)> fda = f; // error: function type mismatch 
    std::function<bool(auto, auto)> gaa = g; // ok 
    std::function<bool(auto, auto)> haa = h; // error: function type mismatch 
    std::function<bool(auto)>   ha = h; // ok 

Và cứ tiếp tục như vậy.

Nói cách khác, để có các đối tượng std::functionbị hạn chế về các loại chức năng mà chúng chấp nhận?

(Hiện nay, trên GCC chúng tôi nhận được một error: 'auto' parameter not permitted in this context.)

+0

Làm thế nào bạn sẽ gọi một hàm 'std :: ', giả định một điều như vậy tồn tại? –

+0

@ n.m .: Rất, rất cẩn thận. –

+0

@LightnessRacesinOrbit như trái ngược với các cuộc gọi cẩu thả thông thường của các hàm trước C++ 17? –

Trả lời

7

Đó là không phi kiểu lập luận mẫu, vì vậy auto không được phép có trong C++ 17.

Đối số mẫu không phải là đối số cho mẫu là con trỏ hoặc số nguyên hoặc giá trị thực, tương tự, không phải loại.

Đối với một ví dụ,

std::integral_constant<std::size_t, 7>; 

ở đây 7 là một tổ chức phi kiểu mẫu đối số kiểu std::size_t và giá trị so 7.

Non-kiểu mẫu auto giấy phép gì đó như:

template<auto x> 
using integral = std::integral_constant< decltype(x), x >; 

tại integral<7>std::integral_constant<int, 7>.

Mặt khác, việc sử dụng auto của bạn thay cho một loại loại, không phải là loại không.


Có một tính năng mà các loại mẫu được suy luận, vì vậy bạn có thể viết:

std::function faa = f; 

nếu họ tăng cường std::function để có thể suy ra một chữ ký từ một con trỏ hàm (hoặc không -template có thể gọi được).

Lưu ý rằng điều này std::function sẽ có chữ ký cố định chứ không phải chữ ký mẫu. Tính năng này chỉ cho phép khấu trừ , không cho phép gửi mẫu động.

Tôi không biết nếu std::function được tăng cường theo cách này trong C++ 17, nhưng tính năng ngôn ngữ để làm như vậy đã được thêm vào.

+0

* "gửi mẫu động" * chúa ơi ...Tôi hy vọng rằng điều này không bao giờ tồn tại –

+0

@GuillaumeRacicot Đơn giản chỉ cần gửi một trình biên dịch, một trừu tượng của nguồn, và yêu cầu người gọi cung cấp tương tự cho các đối số mẫu được thông qua. Biên dịch nó và ghi nhớ việc biên dịch trong quá trình gửi. Dễ như ăn bánh! Các ngôn ngữ scripting/bytecode làm tất cả thời gian (thường với ít năng lượng hơn các mẫu C++). – Yakk

Các vấn đề liên quan