Re: Help on DDJ article on template meta-programming
To make your code work, all you have to do is remove one extra
"typename". Replace
template <typename T>
struct meta_non_reference
{
typedef typename meta_if<
typename meta_is_reference<T>::value,
typename meta_remove_reference<T>::type,
typename meta_identity<T>::type
>::type type;
};
with
template <typename T>
struct meta_non_reference
{
typedef typename meta_if<
meta_is_reference<T>::value,
typename meta_remove_reference<T>::type,
typename meta_identity<T>::type
>::type type;
};
The reason why the "typename" is incorrect here is that the expression
meta_is_reference<T>::value
is actually an enum.
The reason for all of this is of course that back in 2002, compiler
support for the typename keyword was spotty. I was using some version
of the Metroworks compiler, which did support the "typename" keyword.
However, as I found out as I went along, it would often let me get
away with forgetting to put a "typename" where it actually belonged.
Those are the ones that you correctly inserted. Sorry that this is
causing you grief seven years later... But I'm also glad to hear that
you did find the article at least somewhat useful.
Thomas Becker, author of the article where the code appeared
On Aug 25, 1:37 pm, "marco.guazz...@gmail.com"
<marco.guazz...@gmail.com> wrote:
Dear all,
I'm experiencing with meta-programming (I'm a newbie).
I've found an interesting article by Thomas Becker
athttp://www.ddj.com/cpp/184401565
Unfortunately the code does not compile: with GCC 4.1.1 I get 18
errors.
The command used for compiling is:
g++ -Wall -Wextra -ansi meta.cpp
where meta.cpp is the source code.
I've tried to make some adjustments and I end up with "only" 2 errors.
Now I don't understand why my final version does not compile.
Can someone able to explain why this not work and how to fix it?
Here below is the code:
---[begin code]---
#include <iostream>
/// META-IF
template <bool Cond, typename ThenType, typename ElseType>
struct meta_if
{
typedef ThenType type;
};
template <typename ThenType, typename ElseType>
struct meta_if<false, ThenType, ElseType>
{
typedef ElseType type;
};
/// META-IS-REFERENCE
template <typename T>
struct meta_is_reference
{
enum { value = false };
//static const bool value = false;
};
template <typename T>
struct meta_is_reference<T&>
{
enum { value = true };
//static const bool value = true;
};
/// META-REMOVE-REFERENCE
template <typename T>
struct meta_remove_reference
{
typedef T type;
};
template <typename T>
struct meta_remove_reference<T&>
{
typedef T type;
};
/// META-IDENTITY
template <typename T>
struct meta_identity
{
typedef T type;
};
/// META-NON-REFERENCE
template <typename T>
struct meta_non_reference
{
typedef typename meta_if<
typename meta_is_reference<T>::value,
typename meta_remove_reference<T>::type,
typename meta_identity<T>::type
>::type type;
};
int main()
{
typedef meta_non_reference<int>::type my_type1;
my_type1 x1;
typedef meta_non_reference<int&>::type my_type2;
my_type2 x2;}
---[end code]---
Thank you very much!!
Best,
-- Marco
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]