2013-12-17 15 views
6

Tôi muốn sử dụng một đối số std::function làm phương pháp và đặt giá trị mặc định là std::stoi.Cách tạo hàm std :: làm đối số phương thức với std :: stoi làm giá trị mặc định?

Tôi đã thử các mã sau:

void test(std::function<int(const std::string& str, size_t *pos , int base)> inFunc=std::stoi) 

Đáng tiếc là tôi nhận được lỗi sau:

no viable conversion from '<overloaded function type>' to 'std::function<int (const std::string &, size_t *, int)>' 

tôi quản lý để biên dịch bằng cách thêm tạo ra một phương pháp chuyên dụng.

#include <functional> 
#include <string> 


int my_stoi(const std::string& s) 
{ 
    return std::stoi(s); 
} 

void test(std::function<int(const std::string&)> inFunc=my_stoi); 

Có gì sai trong phiên bản đầu tiên? Không thể sử dụng std::stoi làm giá trị mặc định?

Trả lời

12

What's wrong in the first version?

Có hai định nghĩa chồng cho stoi, cho stringwstring. Thật không may, không có cách thuận tiện để phân biệt giữa chúng khi lấy một con trỏ đến hàm.

Isn't it possible to use std::stoi as default value?

Bạn có thể biến đổi thành kiểu của sự quá tải mà bạn muốn:

void test(std::function<int(const std::string&)> inFunc = 
    static_cast<int(*)(const std::string&,size_t*,int)>(std::stoi)); 

hoặc bạn có thể bọc nó trong một lambda, mà là tương tự như những gì bạn đã làm nhưng không giới thiệu một chức năng không mong muốn name:

void test(std::function<int(const std::string&)> inFunc = 
    [](const std::string& s){return std::stoi(s);}); 
+0

Tại sao nó không khiếu nại trên 'typedf int (* fn) (const std :: string &, size_t *, int); fn f = std :: stoi; '? –

+2

@CharlesPehlivanian: Bởi vì chỉ có một quá tải có thể chuyển đổi thành loại chức năng đó (đó là lý do khiến diễn viên trong ví dụ của tôi hoạt động). Hoặc có thể là một đối số cho hàm tạo mẫu của 'std :: function' và trình biên dịch không được phép khởi tạo cả hai chuyên môn mẫu để xem cái nào có thể hợp lệ. –

+0

@MikeSeymour: cảm ơn lời giải thích, tôi đã nghĩ rằng có một cái gì đó như thế này nhưng không thể tìm ra cái gì. –

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