是否可以在C ++中向数据类型添加成员函数?

时间:2019-07-17 16:28:24

标签: c++

我想使用“ String.prototype”为javascript中的数据类型创建函数。在C ++中也可以吗?

例如:

int functionName()
{
    if(this.string == "something") {
        return 1;
    }

    return 0;
}

std::string mystring = "text";

int result = mystring.functionName();

2 个答案:

答案 0 :(得分:3)

不,不是。

您可以从类继承并将新成员添加到新的派生类,但也可以考虑使用组成,因为继承并不总是合适的。有关这方面的更多信息,请查阅本书中有关面向对象编程的章节。

如果不需要访问私有数据,还可以考虑使用免费(非成员)功能。同样,请注意overdoing it with the getters/setters

答案 1 :(得分:1)

您可以通过滥用独立的运算符重载来模拟C ++中的扩展功能。在这里,我利用了operator->*

#include <functional>
#include <iostream>
#include <string>

// Extension function.
static int functionName(std::string const& self) {
    if (self == "something") {
        return 1;
    }

    return 0;
}

// Thunk glue.
static int operator->*(std::string const& s, int(*fn)(std::string const&)) {
    return fn(s);
}

int main() {
    std::string s = "something";
    int i = s->*functionName;
    std::cout << i << "\n";
}

但是我强烈建议您等到将来的某些C ++标准正式采用统一函数调用

编者注:不建议使用,因为它不是C ++惯用的语言,滥用运算符重载是使您不受欢迎的好方法。 C ++本身已经是一种足够困难的语言。