Nous avons des classes de modèles complexes qui ont des méthodes qui ne fonctionneront pas avec certaines politiques ou types. Par conséquent, lorsque nous détectons ces types (au moment de la compilation, en utilisant des caractères de type), nous envoyons une assertion statique avec un bon message.Puis-je exclure certaines méthodes de l'instanciation de modèle manuelle?
Maintenant, nous faisons beaucoup d'instanciation manuelle de modèle. En partie, c'est pour que les méthodes soient obligées de compiler pour vérifier la syntaxe des méthodes. Cela réduit également le temps de compilation pour l'utilisateur de la bibliothèque. Le problème est que les assertions statiques sont toujours lancées et par conséquent nous ne pouvons pas instancier manuellement la classe de modèle en question.
Y a-t-il une solution de contournement pour cela?
EDIT: Pour le rendre plus clair, voici un exemple (l'instanciation explicite dans ce cas échouera sur someFunc1():
// header
template <typename T>
class someClass
{
void someFunc() {}
void someFunc1() { static_assert(false, assertion_failed); }
};
// source
template someClass<int>; // Explicit instantiation
EDIT2. Voici un autre exemple Cette fois-ci vous peut compiler pour voir ce que je veux dire.Compiler d'abord tout de suite.Le code devrait compiler.Puis Décommenter [2] et l'assertion statique devrait se déclencher maintenant commenter [2] et Ne pas commenter [1]. assertion statique wi Il se déclenchera car vous instanciez explicitement le modèle. Je veux éviter de supprimer l'instanciation explicite en raison des avantages qui en découlent (voir ci-dessus pour les avantages).
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;
}
Il n'est pas clair à partir de la description quel est le problème, mais de l'ampleur du problème, il semble que enable_if est pour vous (http://www.boost.org/doc/libs/1_48_0/libs/utility/ enable_if.html) – bobah
@bobah: Ce n'est pas une mauvaise idée du tout ... Je vais m'y pencher. Si vous pouvez préparer un exemple simple que je peux vérifier, je le marquerai comme une réponse? – Samaursa
Je suis d'accord avec les autres qui se plaignent du manque de détails. Mais de toute façon, cela m'a sonné: "Le problème est que les assertions statiques sont toujours tirées". http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html#boost_staticassert.templates, dernière remarque: est-ce le problème que vous rencontrez? –