Различение между typedefs для одного и того же типа в C ++ - PullRequest
7 голосов
/ 28 июня 2010

Я хочу функциональность, аналогичную приведенной ниже:

typedef int A;
typedef int B;


struct foo
{
  foo(A a) { /*specific to type A*/ }
  foo(B b) { /*specific to type B*/ }
};

Я использую typedefs в моей программе, чтобы обозначить логически различное использование одного и того же типа. Итак, я хотел бы создать объект типа Foo по-разному для разных typedefs. Я мог бы скомпилировать это в g ++, но msvc выбрасывает, говоря, что foo (A) уже определена, когда видит второе определение foo (B). Я думал об использовании списка типов и позиции типа в списке, чтобы различать typedefs, и пытался использовать boost :: mpl :: vector:

#include <boost/mpl/vector.hpp >
#include <boost/mpl/find.hpp>

typedef int A;
typedef int B;


struct foo
{
     typedef boost::mpl::vector<A, B> supported_types;

     foo(boost::mpl::find<supported_types, A>::type, A a) {}
     foo(boost::mpl::find<supported_types, B>::type, B b) {}
};

но, к сожалению, find тоже отбрасывает мой typedef и просто возвращает итератор для A в обоих случаях. Я также думал об определении перечисления и использовании его для каждого типа

enum { TYPE_A, TYPE_B };
template <int i> struct int2type {};

и используя этот тип int2 и тип B в программе. Но для меня это выглядит неуверенно, так как подвержено ошибкам. Я хотел бы использовать список типов и сделать это, чтобы было ясно, какие типы будут поддерживаться.

Пожалуйста, дайте мне знать, если есть общий и расширяемый способ сделать это.

Ответы [ 2 ]

9 голосов
/ 28 июня 2010

A boost strong typedef должен делать то, что вы ищете.

#include <boost/strong_typedef.hpp>

BOOST_STRONG_TYPEDEF(int, A);
BOOST_STRONG_TYPEDEF(int, B);
1 голос
/ 28 июня 2010

Попробуйте BOOST_STRONG_TYPEDEF или создайте свою собственную: http://www.drdobbs.com/184401633;jsessionid=PNA3RR4N0WKFNQE1GHRSKH4ATMY32JVN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...