我想要与以下类似的功能:
typedef int A;
typedef int B;
struct foo
{
foo(A a) { /*specific to type A*/ }
foo(B b) { /*specific to type B*/ }
};
我在程序中使用typedef来表示相同类型的逻辑上不同的用法。所以,我想为不同的typedef创建不同类型的foo对象。我可以用g ++编译它,但msvc抛出一个合适的说foo(A)已经定义了它看到第二个定义foo(B)。我想到使用类型列表和列表中的类型的位置来区分typedef并尝试使用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 {};
并在程序中使用此int2type并键入B.但这看起来不优雅,因为它容易出错。我想使用一个类型列表并执行此操作,以便明确支持哪些类型。
如果有通用和可扩展的方法,请告诉我。
答案 0 :(得分:9)
boost strong typedef应该做你想要的。
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(int, A);
BOOST_STRONG_TYPEDEF(int, B);
答案 1 :(得分:1)
尝试BOOST_STRONG_TYPEDEF或实施您自己的:http://www.drdobbs.com/184401633;jsessionid=PNA3RR4N0WKFNQE1GHRSKH4ATMY32JVN