2011-12-25 28 views
12

Viết một hàm tôi phải kê khai đầu vào và dữ liệu đầu ra loại như thế này:có thể thực hiện chức năng sẽ chấp nhận nhiều loại dữ liệu cho đối số đã cho không?

int my_function (int argument) {} 

Có thể thực hiện như một lời tuyên bố rằng chức năng của tôi sẽ chấp nhận biến kiểu int, bool hoặc char, và có thể xuất những dữ liệu này loại?

//non working example 
[int bool char] my_function ([int bool char] argument) {} 
+1

bạn cần phải nhìn vào các mẫu –

+4

nó được gọi là [mẫu] (http: //www.iis .sinica.edu.tw/~ kathy/vcstl/templates.htm) –

+0

@SergioTulentsev Liên kết của bạn đưa ra lỗi 403 – pkqxdd

Trả lời

19

Lựa chọn của bạn là

.210

mẫu THAY THẾ 1

Bạn có thể sử dụng

template <typename T> 
T myfunction(T t) 
{ 
    return t + t; 
} 

THAY THẾ 2

chức năng Plain quá tải

bool myfunction(bool b) 
{ 
} 

int myfunction(int i) 
{ 
} 

Bạn cung cấp một chức năng khác nhau cho mỗi loại mỗi đối số bạn mong đợi. Bạn có thể trộn nó thay thế 1. Trình biên dịch sẽ là một trong những quyền cho bạn.

THAY THẾ 3

Bạn có thể sử dụng kết hợp

union myunion 
{ 
    int i; 
    char c; 
    bool b; 
}; 

myunion my_function(myunion u) 
{ 
} 

THAY THẾ 4

Bạn có thể sử dụng đa hình. Có thể là một overkill cho int, char, bool nhưng hữu ích cho các loại lớp phức tạp hơn.

class BaseType 
{ 
public: 
    virtual BaseType* myfunction() = 0; 
    virtual ~BaseType() {} 
}; 

class IntType : public BaseType 
{ 
    int X; 
    BaseType* myfunction(); 
}; 

class BoolType : public BaseType 
{ 
    bool b; 
    BaseType* myfunction(); 
}; 

class CharType : public BaseType 
{ 
    char c; 
    BaseType* myfunction(); 
}; 

BaseType* myfunction(BaseType* b) 
{ 
    //will do the right thing based on the type of b 
    return b->myfunction(); 
} 
+1

Tại sao không thêm tăng :: bất kỳ, void *, và tăng :: biến thể?Cũng có thể đi theo con đường đầy đủ. – Lalaland

+1

@EthanSteinberg Xin vui lòng chỉnh sửa câu trả lời ... Tôi thường thích gắn với tiêu chuẩn C++ –

+0

Op yêu cầu trả về cùng loại với đối số, không phải 'int' mỗi lần –

1

đọc hướng dẫn này, nó mang lại cho một số ví dụ đẹp http://www.cplusplus.com/doc/tutorial/templates/

+2

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (// meta.stackoverflow.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – CodeMouse92

2

Sử dụng một template:

template <typename T> 
T my_function(T arg) { 
    // Do stuff 
} 

int a = my_function<int>(4); 

Hoặc chỉ cần quá tải:

int my_function(int a) { ... } 
char my_function(char a) { ... } 
bool my_function(bool a) { ... } 
5
#include <iostream> 

template <typename T> 
T f(T arg) 
{ 
    return arg; 
} 

int main() 
{ 
    std::cout << f(33) << std::endl; 
    std::cout << f('a') << std::endl; 
    std::cout << f(true) << std::endl; 
} 

đầu ra:

33 
a 
1 

Hoặc bạn có thể làm:

int i = f(33); 
char c = f('a'); 
bool b = f(true); 
+0

ồ, thật tuyệt với! mẫu này hoạt động như thế nào? – Rhexis

+0

@Rhexis, trong trường hợp này nó ngầm thâm nhập giá trị của 'typename T' dựa trên kiểu đối số của hàm 'f()' là –

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