Conditionnelle au moment de la compilation de l'inclusion/exclusion de code basé sur l'argument de modèle(s)?

De considérer les éléments suivants de la classe, à l'intérieur struct Y être utilisé comme un type, par exemple. dans les modèles, plus tard:

template<int I>
class X{
  template<class T1>
  struct Y{};

  template<class T1, class T2>
  struct Y{};
};

Maintenant, cet exemple sera bien évidemment pas de la compilation, avec l'erreur que le deuxième X<I>::Y a déjà été défini ou qu'elle a trop de paramètres du modèle.

J'aimerais résoudre que sans (très) partielle de la spécialisation, depuis le int I paramètre n'est pas le seul et la position de celui-ci peut différer dans différents partielle des spécialisations (mon struct semble de plus comme cela, le ci-dessus est seulement pour des raisons de simplicité de la question), donc j'aimerais one class fits every I solution.


Ma première pensée a été de toute évidence enable_if, mais qui semble échouer sur moi, par exemple. J'obtiens toujours la même erreur:

//assuming C++11 support, else use boost
#include <type_traits>

template<int I>
class X{
  template<class T1, class = std::enable_if<I==1>::type>
  struct Y{};

  template<class T1, class T2, class = std::enable_if<I==2>::type>
  struct Y{};
};

Donc, depuis enable_if échoue, j'espère qu'il y est un autre moyen d'atteindre les objectifs suivants moment de la compilation, de vérification:

template<int I>
class X{
  __include_if(I == 1){
    template<class T1>
    struct Y{};
  }

  __include_if(I == 2){
    template<class T1, class T2>
    struct Y{};
  }
};

Ce serait juste pour me sauver beaucoup de la duplication de code, mais je serais vraiment heureux si elle est en quelque sorte possible.

Edit: Malheureusement, je ne peux pas utiliser l'évidence: variadic templates, comme je suis à l'aide de Visual Studio 2010, de sorte que seul le C++0x choses qui est pris en charge là, je peux utiliser. :/

  • +1. Question intéressante. Vais essayer d'y répondre après l'heure de bureau 😀
  • Je suis en attente avec plaisir. 🙂 Ma ligne de pensée, c'est qu'il devrait être possible, car le compilateur sait tout ce qu'il faut savoir à la, eh bien, au moment de la compilation.
  • Vous n'êtes autorisé à utiliser le C++0x feautures?
  • désolé, il semble idiot, mais qu'est-ce de variadic templates ? Vous pouvez simplement static_assert la taille de l'emballage.
  • Pas idiot, désolé de ne pas fournir des informations à l': ne Peut pas utiliser le C++0x du variadic templates de pourtant, comme je suis à l'aide de Visual Studio 2010. :/ J'espère vraiment que VC11, pour en ressortir aussitôt, comme ceux variadic templates sont tout simplement génial pour les choses comme cela et le mot de passe de l'idiome.
  • Voir mon commentaire ci-dessus (putain de réponse unique notifications. :P).
  • Vous êtes à défaut, dans le même piège que de nombreux nouveaux utilisateurs, et poser des questions sur la solution plutôt que du problème. Qu'est-ce que vous essayez de résoudre? Comment est cette classe à être utilisé: permettre à un couple de cas d'utilisation exemples de la façon dont la classe est à être utilisé, et pourquoi qui nécessite l'utilisation d'un intérieur de type (avez-vous envisagé de typetraits?) Qui va le rendre plus simple pour argumenter sur le potentiel des approches différentes.
  • Dans le enable_if approche qu'il vous manque un couple de :, j'espère que ce n'était pas la source de l'erreur
  • Oups, non, c'était juste moi de ne pas regarder tout en tapant un exemple dans la question.
  • Mon intention est de faire d'un modèle de typedef, dans un non-C++0x façon, ou comme un général rebind structure comme connu de allocateurs. Mais la question va plus loin, comme en posant des questions sur la compilation conditionnelle basée sur le modèle args en général.

InformationsquelleAutor Xeo | 2011-04-14