C++中空类的优点

Ron*_*Ron 20 c++ class

有一个空课的可能的优点/用途是什么?

PS:这个问题对你们中的一些人来说可能听起来微不足道,但这只是为了学习目的,没有实际意义.仅供参考的谷歌搜索没有帮助.

Mar*_*ner 21

一个用途是在模板(元)编程中:例如,迭代器标签被实现为空类.这里唯一的目的是在编译时传递信息,以便检查传递给例如模板函数的迭代器是否满足特定要求.

例:

真的很简单,只是为了一个想法.这里标记类的目的是决定使用哪种算法实现:

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);
}
Run Code Online (Sandbox Code Playgroud)

(我希望我做对了,自从我使用这个以来已经有一段时间......)

使用此代码,您可以调用myfunc任意迭代器,并让编译器根据迭代器类型(即标记)选择正确的实现.


rve*_*rve 5

例如,可以使用以下boost::variant内容来保存(SQL)NULL值.

class Null { };

typedef boost::variant<Null, std::string, int> Value;
Run Code Online (Sandbox Code Playgroud)

为了使它更有用的东西,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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

会给:

hello
*NULL*
Run Code Online (Sandbox Code Playgroud)