2013-08-01 41 views
7

Đối với cuộc sống của tôi, tôi không thể có được mảnh này đơn giản phức tạp mẫu ma thuật để làm việc:mẫu template chức năng tham số

template<typename T, int a, int b> 
int f(T v){ 
    return v*a-b; // just do something for example 
} 

template<typename T, int a, int b, template<typename,int,int> class func> 
class C{ 
    int f(){ 
    return func<T,a,b>(3); 
    } 
}; 

int main(){ 
    C<float,3,2, f> c; 
} 

phải là có thể này mà không có sự tham gia của functors?

+0

Chính xác bạn đang cố gắng đạt được điều gì? – nijansen

+0

trình biên dịch của tôi bị lỗi khi thực thi mã này. – Saksham

+0

@nijansen không phải là MSVS2010 ổn định ?? – Saksham

Trả lời

7

f được coi là một lớp - bạn có chức năng.

Xem dưới đây:

// Class acts like a function - also known as functor. 
template<typename T, int a, int b> 
class f 
{ 
    int operator()(T v) 
    { 
    return v*a-b; // just do something for example 
    } 
}; 

template<typename T, int a, int b, template<typename,int,int> class func> 
class C 
{ 
    int f() 
    { 
    return func<T,a,b>(3); 
    } 
}; 

int main() 
{ 
    C<float,3,2, f> c; 
} 

... Và phiên bản chuyển thể nếu bạn cần để mã cổng di sản (điều chỉnh các chức năng để một lớp mẫu):

#include <iostream> 


template<typename T, int a, int b> 
int f(T v) 
{ 
    std::cout << "Called" << std::endl; 
    return v*a-b; // just do something for example 
} 

template<typename T, int a, int b, template<typename,int,int> class func> 
struct C 
{ 
    int f() 
    { 
    return func<T,a,b>(3); 
    } 
}; 

template <class T, int a, int b> 
struct FuncAdapt 
{ 
    T x_; 
    template <class U> 
    FuncAdapt(U x) 
    : x_(x) 
    {} 
    operator int() const 
    { 
    return f<T,a,b>(x_); 
    } 
}; 

int main() 
{ 
    C<float,3,2, FuncAdapt > c; 
    c.f(); 
} 
+0

xin chúc mừng những điểm đầu tiên của bạn – Saksham

+0

Cảm ơn bạn. Tôi thấy tôi cần một danh tiếng để upvote ai đó ... Do đó tôi đã trả lời một câu hỏi. –

+0

OP không muốn nó mà không sử dụng functors? (Trích dẫn: "Điều này có thể thực hiện mà không liên quan đến các functors không?") –

-1

Không, không phải. Ngay cả cú pháp:

template <typename T, int a, int b, template <typename, int, int> class func> 
                    ^^^^^ 

cho thấy đối số cho tham số mẫu mẫu phải là mẫu lớp.

+0

Có, tôi biết, tôi đã tìm kiếm một số thủ thuật chỉ để tránh thay đổi mã sản xuất của mình để làm cho mã kiểm thử đơn vị gọn gàng hơn. –

0

Lý do trình biên dịch của bạn là phàn nàn là bạn đang chuyển một hàm (f) làm lớp cho tham số mẫu cuối cùng cho lớp C.

Vì bạn không thể chuyển hàm dưới dạng tham số mẫu, bạn nên sử dụng con trỏ hàm hoặc hàm functors. Và functors chắc chắn là cách sạch hơn để làm điều này.

Vì vậy, mặc dù nó có thể đạt được những gì bạn muốn mà không cần sử dụng functors, bạn thực sự không nên cố gắng.

Nếu bạn muốn sử dụng chức năng gợi ý bạn sẽ được nhìn vào một cái gì đó như thế này:

template<typename T, int a, int b, int (*func)(T)> 
class C{ 
    int f(){ 
     return (*func)(3); 
    } 
}; 

int main(){ 
    C< float,3,2,&f<float,3,2> > c; 
} 

Trong trường hợp đó tôi không nghĩ rằng bạn sẽ có thể loại bỏ sự trùng lặp mã trong việc kê khai của c, nhưng tôi có thể sai.

6

Bạn có thể giải quyết nó thông qua một thủ đoạn gian trá chút:

template<typename T, int a, int b> 
int f(T v){ 
    return v*a-b; // just do something for example 
} 

template<typename T, int, int> 
using func_t = int (*)(T); 

template<typename T, int a, int b, func_t<T, a, b> func> 
class C{ 
    int f(){ 
    return func(3); 
    } 
}; 

C<float,3,2, f<float, 3, 2>> c; 

Trước tiên, bạn cần một kiểu bí danh cho các chức năng (func_t ở trên), và bạn không may cần phải lặp lại các đối số mẫu trong việc kê khai của c.

+1

... trong C++ 11, nếu trình biên dịch của bạn hỗ trợ các bí danh mẫu. MSVC 2013 * vẫn * không – SteveLove

+0

Tôi muốn tránh trùng lặp các đối số mẫu, điều này có nghĩa vụ phải tiết kiệm cho tôi từ việc gõ/copypaste rất nhiều trong các bài kiểm tra đơn vị của tôi. Appart từ đó, đây là câu trả lời tốt nhất cho đến nay. –

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