Я хочу функциональность, аналогичную приведенной ниже:
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 в программе. Но для меня это выглядит неуверенно, так как подвержено ошибкам. Я хотел бы использовать список типов и сделать это, чтобы было ясно, какие типы будут поддерживаться.
Пожалуйста, дайте мне знать, если есть общий и расширяемый способ сделать это.