Davvero, in C "vanilla" ++ voi o scrivi la mano, per tipi specifici, o usi un modello come suggerito da dirkentemente.
Detto questo, se si può usare Boost che fa ciò che si vuole:
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;
}
Questo genererà un errore di compilazione con il messaggio TYPE_NOT_ALLOWED
incorporato in esso se il tipo in fase di compilazione non è contenuta nel TypeList.
Inoltre, poiché questa risposta richiede Boost, ho usato solo lexical_cast
. Noterai che stai ripetendo quel codice, e questo è male. Considerare wrapping tale funzionalità in una funzione.
Se non sei in grado di utilizzare Boost, è possibile simulare questo abbastanza facilmente con alcuni tratti del 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;
}
Questo sarà anche generare un errore di compilazione se l'asserzione non riesce , anche se il codice non è così sexy. :(< - Non sexy
@anon: lo vuoi solo per questi tipi o è accettabile anche per altri tipi? In altre parole, se provi a usare un altro tipo cosa dovrebbe accadere? Un errore del compilatore o un no op o push_back() nel vettore? – Naveen
Duplicato: http://stackoverflow.com/questions/148373/c-restrict-template-function – Clifford
@Clifford: Ma nessuno di questi è sexy come la mia soluzione :) :) – GManNickG