模板参数tag的用法

//通过结构体/类的类型来作为模板参数的tag,
//用来区分tag之间的区别。
//made by davidsu33
//例如对于某个全局的静态变量,你如果希望有
//很多份,但是其实现又是一样的,你可以考虑
//以模板的形式,通过类tag来区分

//而且还可以根据实际需要来特化模板

#include "stdafx.h"
#include <iostream>
#include <cassert>

using namespace std;

template<class Tag> class Instance;

template<class Tag>
class Instance
{
public:
	~Instance(){};

	static Instance &getInstance()
	{
		static Instance  s_instance;
		return s_instance;
	}

	void doOne()
	{
		cout<<"do One"<<endl;
	}

	void doTwo()
	{
		cout<<"do Two"<<endl;
	}

private:
	Instance(){};
	Instance& operator=(const Instance&);
	Instance(const Instance&);
};

struct TagOne{};
struct TagTwo{};
struct TagThree{};

typedef Instance<TagOne> InstanceOne;
typedef Instance<TagTwo> InstanceTwo;

template<>
class Instance<TagThree>
{
public:
	void doOne()
	{
		cout<<"do Three"<<endl;
	}

	void doTwo()
	{
		cout<<"do Three"<<endl;
	}
};

void test_instance()
{
	InstanceOne &one = InstanceOne::getInstance();
	InstanceTwo &two = InstanceTwo::getInstance();

	void* ptrOne = static_cast<void*>(&one);
	void *ptrTwo = static_cast<void*>(&two);

	assert(ptrOne != ptrTwo);

	Instance<TagThree> three1, three2, three;
	three.doOne();
	three.doTwo();
}

int _tmain(int argc, _TCHAR* argv[])
{
	test_instance();

	getchar();
	return 0;
}

模板参数tag的用法,布布扣,bubuko.com

时间: 2024-10-25 19:16:19

模板参数tag的用法的相关文章

VS自定义项目模板:[8]自定义模板参数

如何在模板中定义和使用自定义模板参数? 1 CustomParameters元素的父元素是TemplateContent 下面定义一个模板参数$Para1$,值为MyObj. ps:CustomParameters元素定义在Project上方时,编译器会有一个警告,但不影响模板项目生成. 2 将源文件Class1.cs文件生成为目标项目的MyObj.cs文件 修改模板文件中的TargetFileName,模板项目文件中的包含文件以及Class1.cs的类名为自定义模板参数$Para1$ 3 重新

Python模板库Mako的用法

Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django.Jinja2等等. 基本用法 创建模板并渲染它的最基本的方法是使用 Template 类: from mako.template import Template t = Template('hello world!') print t.render() 传给 Template 的文本参数被编译为一个Python模块.模块包含一个 render_body() 函数,它产生模板的输出.调用 render

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代

c++ 模板参数做容器参数,迭代器报错 vector&lt;T&gt;::const_iterator

错误如下: template<class T>void temp(std::vector<T>& container){        std::vector<T>::const_iterator p; //error: expected ‘;’ before ‘p’        for(p = container.begin(); p != container.end(); ++p)        {                //...       

模板系列(一) 模板的模板参数

前面我们写过类似的Stack: template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc _cont; }; 那么我们使用的时候需要这样: Stack<string, list<string>

STL的map容器将第3个模板参数设为less_equal或greater_equal会怎样?

最近都在学Linux系统编程,用C就足矣,有段时间没碰C++了,于是实现些算法练手. 实现多项式乘法的时候发现有几项没有合并同类项,最终调试到这一步时发现了问题. res是map类型,用find查找key为1991的key-value时,结果得到的却是<12,1>的key-value. 于是转去看那段代码,发现了问题.因为map默认是升序排列,我最后需要打印的多项式是按照幂次数(即这里res的key)降序排列,所以我需要设置map的第3个模板参数,但是由于代码补全我没确认就选择了. map&l

模板系列(一)模板的模板参数

在之前,我们写过类似的stack template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc cont_; }; 那么我们使用的时候,需要这样写 Stack<string, list<string>

UIView-(frame,center,bounds,tag,transform)用法

frame: 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0,0)) 可以调整控件的大小和位置 不能直接给frame的属性进行赋值_btn.frame.origin.y -=50是错误的,正确的做法应该如下图. 1 CGRect frame = _btn.frame; 2 frame.origin.y -= 50; 3 _btn.frame = frame; center: 表示控件的中点(以父控件的左上角为坐标原点) 可以改变控件的位置 不能直接给frame的属性进行赋值_btn.cen

C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:      右值引用无疑是C++11新特性中一颗耀眼的明珠,在此基础上实现了移动语义和完美转发,三者构成了令很多C++开发者拍案叫绝的“铁三角”(当然不是所有C++开发者).而在这个“铁三角”中,有一个无法回避的关键细节,那就是引用叠加规则和模板参数类型推导规则.其实,关于这两个规则,可查到的资料不少,但都