首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟静态值类型

虚拟静态值类型
EN

Stack Overflow用户
提问于 2015-07-15 22:09:57
回答 1查看 68关注 0票数 1

是否有可能为编译时类型安全性和功能重载创建“虚拟”值类型?

例如,greet函数总是接受字符串,但是根据产生字符串的方法,它将调用正确的变量。

我想这样做是为了简化库的API。例如,与greetByFirstName和greetByLastName不同,我只需要一个问候方法,如下所示:

代码语言:javascript
复制
import std.array;
import std.format;
import std.stdio;

string firstName(string name) {
    return name.split(" ")[0];
}

string lastName(string name) {
    return name.split(" ")[1];
}

string greet(FirstName name) {
    return "Hi %s!".format(name);
}

string greet(LastName name) {
    return "Hello Mr. %s!".format(name);
}

unittest {
    string name = "John Smith";
    assert(firstName(name) == "John");
    assert(firstName(name).greet() == "Hi John!");
    assert(lastName(name).greet() == "Hello Mr. Smith!");
}

void main() {}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 00:49:18

您可以创建一个新类型,它将alias this转换为基类型,然后在更特定的类型上重载。别名--可以认为这是一种使用结构进行继承的方法,并将其隐式转换回基“接口”类型。

代码语言:javascript
复制
 // these are the new types
struct FirstName { 
    string name; 
    alias name this; // this allows implicit conversion back to string when needed
} 
struct LastName { 
    string name; 
    alias name this; 
} 
FirstName firstName(string name) {  // these return the more specific  type
    return FirstName(name.split(" ")[0]); 
} 
LastName lastName(string name) { 
    return LastName(name.split(" ")[1]); 
}  

现在,您的其余代码将根据需要工作,您仍然可以在需要时将FirstName和LastName作为字符串处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31442059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档