c++ 11:条件编译:成员
C++11: conditional compilation: members
我试图创建一个具有条件成员的结构体,这意味着不同的成员仅存在于特定的特化中。但是,我希望这门课尽可能快。我已经用三种不同的方式尝试过了:
方式1:
template<typename T, bool with_int = false>
struct foo
{
template<typename... Args>
foo(Args&&... args) : m_t(forward<Args>(args)...)
{}
T m_t;
}
template<typename T>
struct foo<T, true>
{
template<typename... Args>
foo(Args&&... args) : m_t(forward<Args>(args)...), m_id(0)
{}
T m_t;
int m_id;
};
- 缺点:每个专门化重复代码。
方式2:
template<typename T, bool with_int = false>
struct foo
{
template<typename... Args>
foo(Args&&... args) : m_t(forward<Args>(args)...)
{}
virtual ~foo() {}
T m_t;
}
template<typename T>
struct foo<T, false> : public foo<T>
{
using foo<T>::foo;
int m_id = 0;
};
- 优点:代码少。
- 缺点:使用变量/继承/等:更多的时间在构造或访问成员?但是,在另一方面,我并不假装使用基类的"引用"。这种方法的真正优点和缺点是什么?
3
using nil_type = void*;
using zero_type = nil_type[0];
template<typename T, bool with_int = false>
struct foo
{
template<typename... Args, typename = typename enable_if<with_int>::type>
foo(Args&&... args) : m_t(forward<Args>(args)...), m_int(0)
{}
template<typename... Args, typename = typename enable_if<!with_int>::type>
foo(Args&&... args) : m_t(forward<Args>(args)...)
{}
T m__t;
typename conditional<with_int, int, zero_type>::type m_int;
};
- 优势:只写一次代码;当
with_int
=false
时,m_int
字段的大小为0(几乎与gcc 4.7.2一致)。 优点:更多地使用模板(降低可读性),我不确定编译器如何处理大小为0的成员。我确实不知道0号字段在多大程度上是危险的或有意义的。重复构造函数,但也许这是可以避免的。
最好的方法是什么?
您考虑过继承吗?
template< bool >
struct foo_int_base
{
// stuff without the int
void f(); // does not use m_id
};
template<>
struct foo_int_base< true >
{
// stuff with the int
int m_id = 0;
void f(); // uses m_id
};
template< typename T, bool with_int = false >
struct foo : foo_int_base< with_int >
{
// common stuff here
};
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 访问条件类成员的方法不仅在被调用时才编译
- 为什么下面的模板化类成员函数无法编译?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 为什么传递非静态成员函数会导致编译错误?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 在C++中,成员函数在编译时可用吗
- 当包含成员函数名为errno和cerrno时,g++7编译错误
- C++模板-基于参数编译成员函数
- 有一个可迭代的容器,其中的成员在编译时是已知的
- 使用成员函数创建std::函数不会编译
- 在VS2017中,我们如何在项目成员之间共享编译设置
- 如何在类成员函数中获得类似printf中的编译警告
- 为什么 std::condition_variable 作为类成员会导致 std::thread 编译错误?
- 私有静态成员 - 编译错误?
- 模板化类的模板化成员编译失败.VC++ 有效,但 G++ 失败
- 无法从单独的.cpp使用模板化成员编译/链接类
- 绑定到boost::function类成员编译错误