首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++扩展函数?

C++扩展函数?
EN

Stack Overflow用户
提问于 2011-10-28 04:41:49
回答 7查看 9.2K关注 0票数 17

是否有像C#中那样的C++扩展?

例如,在C#中,您可以这样做:

代码语言:javascript
复制
public static uint SwapEndian(this uint value)
{
    var tmp = BitConverter.GetBytes(value);
    Array.Reverse(tmp);
    return BitConverter.ToUInt32(tmp, 0);
}

someuint.SwapEndian();

在C++中有类似的东西吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-28 04:48:47

扩展方法(以及“静态类”)之所以存在于C#/Java语言中,仅仅是因为设计者认为( Java的方式) OOP是唯一正确的方式,并且所有东西都必须是来自类的方法:

这不是C++做事情的方式。在C++中,您可以使用名称空间、自由函数和Koenig lookup来扩展类的行为:

代码语言:javascript
复制
namespace foo
{
    struct bar { ... };

    void act_on_bar(const bar& b) { ... };
}

...

foo::bar b;
act_on_bar(b); // No need to qualify because of Koenig lookup

我通常认为扩展方法是有害的。如果你给一个类附加了太多的行为,你可能无法捕捉到这个类存在的原因。而且(就像“局部类”一样),它们倾向于使代码与类相关。这很糟糕。

对于您的问题,在C++中您只需执行以下操作:

代码语言:javascript
复制
template <typename T>
T swap_endian(T x)
{
    union { T value; char bytes[sizeof(T)]; } u;
    u.value = x;

    for (size_t i = 0; i < sizeof(T)/2; i++) 
        swap(u.bytes[i], u.bytes[sizeof(T) - i - 1]);

    return u.value;
}

用法:

代码语言:javascript
复制
swap_endian<std::uint32_t>(42);

或者,如果可以推导出类型:

代码语言:javascript
复制
std::uint64_t x = 42;
std::uint64_t y = swap_endian(x);
票数 7
EN

Stack Overflow用户

发布于 2011-10-28 04:44:34

C++中没有扩展函数。您可以将它们定义为自由函数。

代码语言:javascript
复制
uint SwapEndian(uint value){ ... }
票数 6
EN

Stack Overflow用户

发布于 2011-10-28 04:46:53

不是这样的,但是你可以编写操作符重载,它可以在你没有编写的类上工作,这有点像方法扩展(但不是针对命名函数,只针对尚未由该类定义的操作符)。典型的例子就是让你的类使用cout

代码语言:javascript
复制
class MyClass {
public:
    MyClass(const char* blah) : str(blah) { }

    const char* string() const {
        return str;
    }

private:
    const char* str;
};

// this is kinda like a method extension
ostream& operator<<(ostream& lhs, const MyClass& rhs) {
    lhs << rhs.string();
}

// then you can use it like this
MyClass m("hey ho");
cout << m;

// prints hey ho

当然,这是一个微不足道的例子,但您可以理解其中的含义。

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

https://stackoverflow.com/questions/7922112

复制
相关文章

相似问题

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