Abbiamo classi modello complesse con alcuni metodi che non funzionano con determinati criteri o tipi. Pertanto, quando rileviamo quei tipi (in fase di compilazione, utilizzando i caratteri tipografici), attiviamo un'asserzione statica con un bel messaggio.Posso escludere alcuni metodi dall'istanza del modello manuale?
Ora eseguiamo anche molte istanze di template manuali. In parte è così che i metodi sono obbligati a compilare il sintattico per verificare i metodi. Riduce anche il tempo di compilazione per l'utente della biblioteca. Il problema è che le asserzioni statiche sono sempre attivate e di conseguenza non possiamo istanziare manualmente la classe template in questione.
Esiste una soluzione alternativa?
EDIT: per renderlo più chiaro, ecco un esempio (l'istanza esplicita in questo caso non riuscirà a someFunc1():
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2:. Ecco un altro esempio Questa volta si può compilare per vedere quello che voglio dire. In primo luogo compilare subito. il codice dovrebbe compilare. Poi Decommentare [2] e l'affermazione statica dovrebbe sparare. Ora commento fuori [2] e Decommentare [1]. il asserzione statica wi Sparerai perché stai istanziando esplicitamente il modello. Voglio evitare di rimuovere l'istanziazione esplicita a causa dei benefici che ne derivano (vedi sopra per i benefici).
namespace Loki
{
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
}
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template <typename T>
class foo
{
public:
void func() {}
void func1() { LOKI_STATIC_CHECK(sizeof(T) == 4, Assertion_error); }
};
template foo<int>;
//template foo<double>; // [1]
int main()
{
foo<int> a;
a.func1();
foo<double> b;
//b.func1(); //[2]
return 0;
}
Non è chiaro dalla descrizione qual è il problema, ma dall'ambito del problema sembra che enable_if sia per voi (http://www.boost.org/doc/libs/1_48_0/libs/utility/ enable_if.html) – bobah
@bobah: non è affatto una cattiva idea ... ci penserò. Se riesci a preparare un semplice esempio che posso verificare, lo contrassegnerò come risposta? – Samaursa
Sono d'accordo con gli altri che si lamentano della mancanza di dettagli. Ma comunque, questo mi ha fatto suonare un campanello: "Il problema è che le asserzioni statiche sono sempre sparate". http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html#boost_staticassert.templates, ultima osservazione: è questo il problema che stai riscontrando? –