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任意迭代器,并让编译器根据迭代器类型(即标记)选择正确的实现.
例如,可以使用以下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)
| 归档时间: |
|
| 查看次数: |
17796 次 |
| 最近记录: |