【问题标题】:C++ - extending a data typeC++ - 扩展数据类型
【发布时间】:2012-09-06 00:36:46
【问题描述】:

有没有办法像在 JavaScript 中一样在 C++ 中扩展数据类型?

我想这有点像这样:

char data[]="hello there";
char& capitalize(char&)
{
    //Capitalize the first letter. I know that there
    //is another way such as a for loop and subtract
    //whatever to change the keycode but I specifically 
    //don't want to do it that way. I want there
    //to be a method like appearance.
}

printf("%s", data.capitalize());

这应该以某种方式打印出来。

【问题讨论】:

  • 不在 C++ 中。但是你可以做类似capitalize(data)的事情。
  • 如果有问题的数据类型是结构/类,您可以(但可能不应该)从它继承。对于像 intchar (或其中的数组)这样的内置类型,你几乎不走运。
  • 我认为这与原始类型没有多大关系。但是对于类,您可以只制作一些 java 风格的东西,并让它们全部实现一个让我们说具有给定方法 toString()、capitalize() ecc 的“可打印”接口:/ 或者您可以只制作一个模板或静态函数来传递值。

标签: c++ arrays methods char extend


【解决方案1】:

在 C++ 中没有办法做到这一点。在我看来,最接近这一点的是创建一个行为类似于内置类型但会提供额外功能的类。永远不可能让它们 100% 像内置类型一样工作,因此“代理”类型并不总是理想的。

【讨论】:

  • 这是一个很好的答案,可能是最好的解决方案,但我对给它打分持谨慎态度,因为我不想误导别人,但是你是一个类 SString(特殊字符串)或类似的东西可能需要,我可以在其中创建任何内容
【解决方案2】:

你能得到的最接近的是使用运算符重载,例如

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>

std::string operator!(const std::string& in) {
  std::string out = in;
  std::transform(out.begin(), out.end(), out.begin(), (int (*)(int)) std::toupper);
  return out;
}

int main() {
  std::string str = "hello";
  std::cout << !str << std::endl;
  return 0;
}

替代方法包括创建一个重载 operator std::string 的类和一个使用 std::string 对其进行初始化的构造函数。

【讨论】:

    【解决方案3】:

    不,JavaScript 基于对象的原型。这个概念不适用于C++。它们是如此不同的语言,我什至无法为您的问题举一个反例。

    【讨论】:

    • 大声笑感谢您的帮助,我知道这将具有挑战性。我想知道我们最接近该解决方案的可能是什么。我想使用一个新的类。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多