是否有像C#中那样的C++扩展?
例如,在C#中,您可以这样做:
public static uint SwapEndian(this uint value)
{
var tmp = BitConverter.GetBytes(value);
Array.Reverse(tmp);
return BitConverter.ToUInt32(tmp, 0);
}
someuint.SwapEndian();在C++中有类似的东西吗?
发布于 2011-10-28 04:48:47
扩展方法(以及“静态类”)之所以存在于C#/Java语言中,仅仅是因为设计者认为( Java的方式) OOP是唯一正确的方式,并且所有东西都必须是来自类的方法:
这不是C++做事情的方式。在C++中,您可以使用名称空间、自由函数和Koenig lookup来扩展类的行为:
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++中您只需执行以下操作:
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;
}用法:
swap_endian<std::uint32_t>(42);或者,如果可以推导出类型:
std::uint64_t x = 42;
std::uint64_t y = swap_endian(x);发布于 2011-10-28 04:44:34
C++中没有扩展函数。您可以将它们定义为自由函数。
uint SwapEndian(uint value){ ... }发布于 2011-10-28 04:46:53
不是这样的,但是你可以编写操作符重载,它可以在你没有编写的类上工作,这有点像方法扩展(但不是针对命名函数,只针对尚未由该类定义的操作符)。典型的例子就是让你的类使用cout
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当然,这是一个微不足道的例子,但您可以理解其中的含义。
https://stackoverflow.com/questions/7922112
复制相似问题