Я хочу функциональность, подобную ниже:
typedef int A;
typedef int B;
struct foo
{
foo(A a) { /*specific to type A*/ }
foo(B b) { /*specific to type B*/ }
};
Я использую определения типов в своей программе для обозначения логически другого использования того же типа. Так, я хотел бы создать объект нечто типа по-другому для различных определений типов. Я мог скомпилировать это в g ++, но msvc закатывает истерику, говоря, что нечто (A) уже определяется, когда это видит второе нечто определения (B). Я думал об использовании списка типов и положения типа в списке для различения между определениями типов и пытался использовать повышение:: mpl:: вектор:
#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) {}
};
но к сожалению, найдите также отбрасывания моим определением типа, и просто возвращает итератор для в обоих случаях. Я также думал об определении перечисления и использовании его для каждого типа
enum { TYPE_A, TYPE_B };
template <int i> struct int2type {};
и использование этого int2type и типа B в программе. Но это выглядит неэлегантным мне, поскольку это подвержено ошибкам. Я хотел бы, используют список типов и делают это, так, чтобы было ясно, какие типы поддерживались бы.
Сообщите мне, существует ли универсальный и расширяемый способ сделать это.
А boost strong typedef должен сделать то, что вы ищете.
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(int, A);
BOOST_STRONG_TYPEDEF(int, B);
Попробуйте BOOST_STRONG_TYPEDEF или реализуйте свой собственный: http://www.drdobbs.com/184401633;jsessionid=PNA3RR4N0WKFNQE1GHRSKH4ATMY32JVN