Boost logo

Boost Users :

Subject: Re: [Boost-users] Detect specialized template function?
From: Andrew Chinkoff (achinkoff_at_[hidden])
Date: 2010-01-30 06:29:59


Hi, Daniel.

This is your example:

template <class T>
void S::f()
{
 if(g is specialized) // (1)

   callbacks_ready=true;
 // else wait for a callback object to be registered
}

At (1) the runtime detection is used, but "S:g()" was specialized at compile
time.
Templates are specialized and compiled at compile time, but not runtime.

We can't write "if(g is specialized)" - it is impossible to realize it at
runtime (and it is senseless).

So let me to recommend you some books of H. Sutter and A. Alexandrescu.
There are a lot of recommendations about templates, their specializations,
overloads, static/dynamic polymorphisms and more.

1st book:

[http://www.gotw.ca/publications/xc++s.htm]

Pay attention to this chapter of the book:
"Item 7: Why Not Specialize Function Templates?"

2nd book;

"C++ Coding Standards: 101 Rules, Guidelines, and Best Practices" (authors
H. Sutter and A. Alexandrescu)
Pay attention to 64, 65, 66 and 67 chapters.

I hope you will find some useful ideas about templates in these books.

There are also Boost libraries targeted to realize static polymorphism:
1) http://www.boost.org/doc/libs/1_40_0?view=category_Generic
2) http://www.boost.org/doc/libs/1_40_0?view=category_Metaprogramming

Best,
Andrew.

> Slightly OT, but I was hoping someone here might know the magic
incantation

> (which may involve a Boost library).

> Given a template class such as

> template <class T>
> struct S
> {
> void f();
> void g() { T t(h()); cb(t) }
> T & h();
> boost::function1<void, T &> cb;
> };

> Is there a way to have S.f() behave differently depending on whether S.g()
uses
> the default definition or whether it is specialized for this particular
type?
> This detection needs to occur before S.g() is ever called.

> For example, the mere existance of the specialization
> template <> void S<int>::g() { ... }
> should trigger special logic in S<int>::f().

> Thanks,
> Daniel
> P.S. The motivation for this is an attempt to retrofit a callback API that

> allows specialization of S.g() or the registration of a boost::function
that
> gets called by the default S.g(). We need to disable callbacks until an
actual
> function is registered via either method. It is easy to dispatch on
> registration of the boost::function; I don't know how to detect the
> specialization.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net