我们的C++17代码库中有一个宏,它说:
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member
有没有可能在不使用宏的情况下在现代C++中实现相同的功能?
一个函数或者一个函数和一个类型的组合能够做到这一点吗?
发布于 2019-03-14 07:30:09
它不能被完美地替换。问题是alignas
属性只能应用于两个地方。到(成员) varaible的声明,或者到类类型的声明。因此,一个潜在的替代品可能是这样的:
template<typename Type>
struct alignas (NextPow2(sizeof(Type))) ApotDef {
Type mem;
operator Type& () & { return mem; }
operator Type const& () const& { return mem; }
operator Type&& () && { return std::move(mem); }
// Maybe for volatile?
};
因此,APOT_DEF(Type, Member)
的每一次出现都可能被ApotDef<Type> Member;
所取代。这将允许在Type
本身可以使用的许多相同的地方使用ApotDef<Type>
,但这不是一滴替代品。会有一些实例(大多数涉及类型演绎)不会触发到Type
glvalue的转换。
因此,如果确切的成员类型对您很重要,我将坚持使用宏。不过,我会稍微修改一下,使声明更像是" C++“,而不是包装C++的DSL。我会使用这个宏:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
所以变量声明至少要有声明的形式:
APOT_ALIGNED(Type) member;
https://stackoverflow.com/questions/55155745
复制相似问题