2012-02-02 45 views
5

Tôi muốn thêm một số đường cú pháp vào một lớp bằng cách nạp chồng() làm phương thức getter. Tuy nhiên, phương thức getter lấy một đối số mẫu không kiểu. Xem xét một trường hợp thử nghiệm đơn giản:Tôi có thể chuyển một đối số mẫu không kiểu cho một toán tử bị quá tải không?

#include <iostream> 

class Foo 
{ 
public: 
    template <int i> void get() 
    { 
    std::cout << "called get() with " << i << std::endl; 
    } 
    template <int i> void operator()() 
    { 
    std::cout << "called overloaded() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo foo; 
    foo.get<1>(); 
    foo.get<2>(); 
    foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’ 
    return 0; 
} 

Việc biên dịch và chạy như mong đợi nếu foo<3>(); được nhận xét. Có cú pháp C++ hỗ trợ những gì tôi đang cố gắng làm, hay tôi nên từ bỏ và gắn bó với một phương thức được đặt tên cho getter?

+1

Tôi không thể chứng minh điều đó ngay bây giờ nhưng chắc chắn rằng cách duy nhất là 'foo.operator() <3>()', có thể sẽ đánh bại mục đích. – PlasmaHH

Trả lời

8

Cú pháp bạn đang tìm kiếm tồn tại, nhưng bạn sẽ không thích nó:

foo.operator()<3>(); 

Vì vậy, gắn bó với các chức năng được đặt tên.

+0

@ Lightness Races in Orbit: nevermind – noisy

0

Bạn có thể quản lý bằng cách đặt mẫu vào các lớp như sau: Tuy nhiên

template<int i> 
class Foo 
{ 
    Foo() 
    { 
     std::cout << "called overloaded() with " << i << std::endl; 
    } 

    static void Get() 
    { 
     std::cout << "called get() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo<1>::Get(); 
    Foo<3>(); 
    return 0; 
} 

Có một lỗ nhỏ như bạn sẽ xây dựng một đối tượng Foo khi gọi các hình thức trực tiếp(). Ngoài ra, tôi đoán mã đời thực của bạn có rất nhiều thứ khác trong lớp Foo, vì vậy có thể sẽ không chấp nhận được để chuyển mẫu sang lớp (có thể là một thay đổi thiết kế quan trọng) chỉ để quản lý việc này .

CHỈNH SỬA:

Thực ra vì có thể đã có trường hợp Foo mà OP đang sử dụng, toàn bộ đề xuất của tôi là câm. Đừng bận tâm.

+0

Tôi hoàn toàn đồng ý với bạn rằng nó có thể sẽ không được chấp nhận để di chuyển mẫu đến lớp. Không phải vì nó quá nhiều giá để hoàn thành một nhiệm vụ nhỏ, nhưng vì nó sẽ không hoàn thành * bất cứ điều gì * –

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