拥有一个空类可能会有哪些优点或用途?
附言: 这个问题对于一些人来说可能听起来很琐碎,但它只是为了学习目的,没有实际意义。值得注意的是,谷歌搜索并没有提供帮助。
拥有一个空类可能会有哪些优点或用途?
附言: 这个问题对于一些人来说可能听起来很琐碎,但它只是为了学习目的,没有实际意义。值得注意的是,谷歌搜索并没有提供帮助。
其中一种用途是在模板(元)编程中:例如,迭代器标签被实现为空类。这里唯一的目的是在编译时传递信息,以便您可以检查传递给例如模板函数的迭代器是否满足特定要求。
示例:
这只是为了让您有一个想法而进行的非常简化。 这里标签类的目的是决定要使用哪个算法实现:
class forward_iterator_tag {};
class random_access_iterator_tag {};
class MySimpleForwardIterator {
public:
typedef typename forward_iterator_tag tag;
// ...
};
class MySimpleRandomIterator {
public:
typedef typename random_access_iterator_tag tag;
// ...
};
template<class iterator, class tag>
void myfunc_int(iterator it, tag t) {
// general implementation of myfunc
}
template<class iterator>
void myfunc_int<iterator, forward_iterator_tag>(iterator it) {
// Implementation for forward iterators
}
template<class iterator>
void myfunc_int<iterator, random_access_iterator_tag>(iterator it) {
// Implementation for random access iterators
}
template<class iterator>
void myfunc(iterator it) {
myfunc_int<iterator, typename iterator::tag>(it);
}
myfunc
函数,并让编译器根据迭代器类型(即标签)选择正确的实现方式。boost::variant
变量。class Null { };
typedef boost::variant<Null, std::string, int> Value;
operator==
和operator<<
这样的东西更加有用。例如:std::ostream& operator<<(std::ostream &lhs, const Null &rhs)
{
lhs << "*NULL*";
return lhs;
}
int main()
{
Variant v("hello");
std::cout << v << std::endl;
v = Null();
std::cout << v << std::endl;
...
}
Will give:
hello
*NULL*
template<class _Arg,
class _Result>
struct unary_function
{ // base class for unary functions
typedef _Arg argument_type;
typedef _Result result_type;
};
在定义一个函数对象时,您可以继承unary_function,然后您就可以自动使用定义的typedef。
您可以将其用作检查目的的占位符,或者作为特殊功能的启用程序。例如,在Java中存在“空”接口Serializable,用于指定类是否可序列化。
p = new(std::nothrow) Bar;
而std::nothrow被简单地定义为
struct nothrow_t {}; //defined in namespace std
typeid
的缘故Id
。我们需要用这个接口的唯一实例来填充一些容器。如何保证由独立软件部分产生的 Id
实例的唯一性?“独立部分”意味着不同的动态库,由不同的程序员从不同的地方编译。typeid
。如果 typeid
匹配,则转换并比较其他实现特定属性。C++ 语言保证任何类型在进程内存中都是唯一的。应该使用哪种类型来实现这个目的?任何资源消耗最小的类型——空类型。这里有一个有趣的链接,其中包含为什么允许使用的答案。你可能会发现这对于寻找可能有用的情况很有帮助。