Realmente, en "vainilla" C++ ya sea escribir a mano, para tipos específicos, o utilizar una plantilla como sugerida dirkgently.
Dicho esto, si se puede usar Boost que esto hace lo que quiere:
template <class T>
StreamLogger& operator<<(T val)
{
typedef boost::mpl::vector<const char*, int,
unsigned, size_t> allowed_types;
BOOST_MPL_ASSERT_MSG(boost::mpl::contains<allowed_types, T>::value,
TYPE_NOT_ALLOWED, allowed_types);
// generic implementation follows
elements.push_back(boost::lexical_cast<std::string>(val));
return *this;
}
Esto generará un error en tiempo de compilación con el mensaje TYPE_NOT_ALLOWED
incrustado en él si el tipo está compilado no está contenida en el lista de tipos
Además, como esta respuesta requiere Boost acabo de utilizar lexical_cast
. Notarás que estás repitiendo ese código, y eso es malo. Considere wrapping esa funcionalidad en una función.
Si no está capaz de usar Boost, puede simular esto con bastante facilidad con algunos rasgos de tipo:
template <typename T, typename U>
struct is_same
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T>
{
static const bool value = true;
};
template <bool>
struct static_assert;
template <>
struct static_assert<true> {}; // only true is defined
// not the best, but it works
#define STATIC_ASSERT(x) static_assert< (x) > _static_assert_
template <class T>
StreamLogger& operator<<(T val)
{
STATIC_ASSERT(is_same<const char*, T>::value ||
is_same<int, T>::value ||
is_same<unsigned, T>::value ||
is_same<size_t, T>::value);
// generic implementation follows
elements.push_back(boost::lexical_cast<std::string>(val));
return *this;
}
Esto también generará un error en tiempo de compilación si falla la aserción , aunque el código no es tan sexy. :(< - No es sexy
@anon: ¿Lo quiere solo para estos tipos o también es aceptable para otros tipos? En otras palabras, si intenta usar algún otro tipo, ¿qué debería pasar? Un error del compilador o un no- op o push_back() en el vector? – Naveen
Duplicado: http://stackoverflow.com/questions/148373/c-restrict-template-function – Clifford
@Clifford: Pero ninguno de ellos es tan sexy como la solución de la mina :) – GManNickG