2011-12-02 22 views
9

Tôi có các cấu trúc và lớp học mà tôi muốn có thể dễ dàng tạo từ các chuỗi theo kiểu chung, sử dụng phương thức to!T(string). Tuy nhiên, tôi không chắc làm thế nào tôi có thể 'ghi đè lên' phương pháp để có được loại hành vi này. Đi từ loại của tôi đến chuỗi là dễ dàng (tôi chỉ cần xác định opCast(string)), nhưng là những gì tôi đang tìm kiếm thậm chí có thể?Ghi đè lên! T() cho T đã xác định trong D?

Trả lời

11

Không xác định opCast cho string nếu bạn muốn loại của mình chuyển đổi thành string. Đó là những gì toString là dành cho. writelnformat và cách sử dụng tương tự toString, không được đúc hoặc toto sẽ sử dụng toString, vì vậy, tốt hơn nên xác định toString để chuyển đổi thành string. Bạn xác định opCast để chuyển đổi thành các loại khác hơn string. Sau đó, bạn có thể sử dụng điều đó bằng cách truyền hoặc với to.

Bây giờ, nếu bạn muốn chuyển đổi một string thành loại do người dùng xác định, thì chỉ cần xác định hàm tạo thích hợp và điều đó sẽ hoạt động với to.

import std.conv; 

struct S 
{ 
    int i; 

    this(string s) 
    { 
     i = to!int(s); 
    } 

    string toString() 
    { 
     return to!string(i); 
    } 
} 

void main() 
{ 
    auto s = to!S("42"); 
    assert(s.i == 42); 
    auto t = to!string(s); 
    assert(t == "42"); 
} 
+0

Tuyệt vời, không nhận ra điều đó thật đơn giản! –

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