Thread overview
Specialized TemplateIdentifer for template parameters
Feb 15, 2006
knjhara
Feb 15, 2006
Tom S
Feb 15, 2006
knjhara
February 15, 2006
Hi, all.

I made following code, but cannot compiled it.

--------------------------------------------------
template Connect(alias Adapter1, alias Adapter2)
{
	template AdapterImpl(alias Adapter, alias PrevProc)
	{
		mixin Adapter;		// line 5

		int defaultProc(uint msg)
		{
			return PrevProc(msg);
		}
	}

	int callDefProc(uint msg)
	{
		...
	}

	mixin AdapterImpl!(Adapter2, callDefProc) adptr2;
	mixin AdapterImpl!(Adapter1, adptr2.proc) adptr1;
}

template TestAdapter1()
{
	int proc(uint msg)
	{
		...
		return defaultProc(msg);
	}
}

template TestAdapter2(int param)
{
	int proc(uint msg)
	{
		...
		return defaultProc(msg);
	}
}

class TestClass
{
	mixin Connect!(
		TestAdapter1,			// ok
		TestAdapter2!(1024)		// failed ... mixinTest.d(5): mixin Adapter is
not a template
	);
}
--------------------------------------------------

Do specialized template identifers enable templates to use parameter?

And is it make to use what mixin in template scopes is given alias TemplateIdentifer what to be specialized ?

- knjhara
February 15, 2006
It doesn't work because well... Adapter2 alias in the Connect template is not a template, but a template instance. The following seems to work:

template TestAdapter2(int param)
{
	template TestAdapter2()
	{
		int proc(uint msg)
		{
	//		...
			return defaultProc(msg);
		}
	}
}


That way, TestAdapter2!(1024) really gives you a template, the inner
parameter-less TestAdapter2().



-- 
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/M d-pu s+: a-->----- C+++$>++++ UL P+ L+ E--- W++ N++ o? K? w++ !O
!M V? PS- PE- Y PGP t 5 X? R tv-- b DI- D+ G e>+++ h>++ !r !y
------END GEEK CODE BLOCK------

Tomasz Stachowiak  /+ a.k.a. h3r3tic +/
February 15, 2006
Tom S wrote:
> It doesn't work because well... Adapter2 alias in the Connect template
> is not a template, but a template instance. The following seems to work:
> 
> template TestAdapter2(int param)
> {
> 	template TestAdapter2()
> 	{
> 		int proc(uint msg)
> 		{
> 	//		...
> 			return defaultProc(msg);
> 		}
> 	}
> }
> 
> 
> That way, TestAdapter2!(1024) really gives you a template, the inner
> parameter-less TestAdapter2().

Thank you for answering my poor English, it worked.

But, it means that passing specialized temlates to temlate is impossible.

I want to suggest for Specialized Template Identifer as follows:

mixin Connect!(
  TestAdapter1,
  TestAdapter2(100)	// this is a specialized identifer, not instance
);

What do you think?

-knjhara