2012-10-01 29 views
5

thể trùng lặp:
using declaration in variadic templatevariadic mở rộng của việc sử dụng-khai

Gần đây tôi đi qua a generic mechanism để kết hợp hai đối tượng chức năng để tạo thành một đối tượng chức năng mới mà cư xử như thể lần đầu tiên hai đã bị quá tải:

template <typename F1, typename F2> 
struct overload : public F1, public F2 
{ 
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {} 

    using F1::operator(); 
    using F2::operator(); 
}; 

Tôi đang cố gắng mở rộng ý tưởng này o làm việc cho N đối tượng chức năng, sử dụng mẫu variadic:

template <typename... Fs> 
struct overload : public Fs... 
{ 
    overload(Fs... fs) : Fs(fs)... {} 

    using Fs::operator();... 
}; 

Tuy nhiên, GCC phàn nàn về nỗ lực của tôi để làm mở rộng variadic trên sử dụng-khai:

test.cpp:6:24: error: parameter packs not expanded with '...': 
    using Fs::operator();... 
         ^
test.cpp:6:24: note:   'Fs' 
test.cpp:6:26: error: expected unqualified-id before '...' token 
    using Fs::operator();... 
         ^

Tôi đã thử một số biến thể, chẳng hạn như:

using Fs::operator()...; 

using Fs...::operator(); 

nhưng không phải là lừa.

Có thể thực hiện việc này không?

+1

Lưu ý rằng loại lớp có toán tử chuyển đổi, ví dụ: kiểu con trỏ hàm (một hàm gọi thay thế) là một kiểu functor và chưa tương thích với một cơ chế như vậy. Nó không quan trọng quá nhiều bởi vì đó là kỳ lạ, nhưng nó là một chút bực bội không hoàn toàn chung chung (TTBOMK). –

+1

[Điều này] (http://stackoverflow.com/questions/7870498/using-declaration-in-variadic-template) có thể hữu ích (nếu không phải là câu trả lời, ít nhất là cho những gì đã được thử). –

+0

@Luc: Không phải là bản sao trực tiếp? Đã bỏ phiếu để đóng thành một. – Xeo

Trả lời

0

Thay vì “ Gần đây tôi đi qua một cơ chế chung ”, xin vui lòng cung cấp tài liệu tham khảo như “ Gần đây tôi tình cờ gặp một blog posting by Dave Abrahams mô tả một cơ chế chung ” & hellip ;.

tôi nghi ngờ rằng việc mở rộng gói tham số được hỗ trợ cho using tuyên bố, và tôi ’ m xin lỗi tôi don ’ t có thời gian để kiểm tra các tiêu chuẩn – rằng ’ s nữa việc của bạn, để đọc tài liệu trước khi hỏi câu hỏi.

Nhưng là một vấn đề thực tế trong việc giải quyết vấn đề ở bàn tay (thay vì câu hỏi ngôn ngữ), bạn luôn có thể mã hóa điều này một cách đệ quy thay vì sử dụng mở rộng trực tiếp. Chỉ cần thừa kế từ một lớp học mà mang lại phần còn lại của các functors, sau đó mang lại trong một đầu tiên. Trong trường hợp “ phần còn lại ” là bước đệ quy, kết thúc tại danh sách trống của các hàm là trường hợp cơ sở.

+0

Tôi muốn thêm liên kết đến nơi tôi thấy cơ chế được đề cập, nhưng tôi không thể tìm thấy bài viết hoặc gọi lại tên của nó tại thời điểm tôi viết câu hỏi. Cảm ơn bạn đã đào nó! – HighCommander4

+0

Giải pháp đệ quy là một ý tưởng hay. Trên thực tế, bài viết bạn đã liên kết có liên kết trong chú thích cuối trang (https://gist.github.com/3779345) với giải pháp như vậy. – HighCommander4

+0

@ HighCommander4: heh, tôi không biết. –

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