[英]C++11: conditional compilation: members
I'm trying to make a struct with conditional members, that means, different members exists only with specific specializations. 我正在尝试使用条件成员创建一个结构,这意味着,不同的成员只存在特定的特殊化。 But, I want that this classes are fastest as possible.
但是,我希望这些课程尽可能快。 I've tried it in three differents ways:
我试过三种不同的方式:
Way 1: 方式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;
};
Way 2: 方式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;
};
Way 3 方式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
is false
, field m_int
has size 0 (almost with gcc 4.7.2). with_int
为false
,字段m_int
大小为0(几乎与gcc 4.7.2)。 What is the best approach or method? 什么是最好的方法或方法?
Have you considered inheritance? 你考虑过继承吗?
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
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.