[英]C++ Template for mapping struct type to enum?
我有類似的東西:
struct A { ... };
struct B { ... };
struct C { ... };
class MyEnum {
public:
enum Value { a, b, c; }
}
template<typename T> MyEnum::Value StructToMyEnum();
template<>
MyEnum::Value StructToMyEnum<A>()
{
return MyEnum::a;
}
template<>
MyEnum::Value StructToMyEnum<B>()
{
return MyEnum::b;
}
我基本上是想獲得a
通過調用soemthing直接像
StructToMyEnum<A>();
這是我能想到的最好的,但是當我編譯時,我在嘗試鏈接時得到multiple definition of 'MyEnum::Value StructToMyEnum<A>()'
錯誤的multiple definition of 'MyEnum::Value StructToMyEnum<A>()'
。
有關根據此示例將類型映射到枚舉的最佳方法的任何建議嗎?
您可以在編譯時將類型映射到枚舉:
#include <iostream>
struct A { int n; };
struct B { double f; };
struct C { char c; };
class MyEnum
{
public:
enum Value { a, b, c };
};
template<typename T> struct StructToMyEnum {};
template<> struct StructToMyEnum<A> {enum {Value = MyEnum::a};};
template<> struct StructToMyEnum<B> {enum {Value = MyEnum::b};};
template<> struct StructToMyEnum<C> {enum {Value = MyEnum::c};};
int main (int argc, char* argv[])
{
std::cout << "A=" << StructToMyEnum<A>::Value << std::endl;
return 0;
}
多個定義是因為您需要添加inline
關鍵字或將特化的實現推送到cpp文件中,只在頭文件中留下這樣的聲明。
你可以使用mpl :: map來編寫一個通用版本。 像這樣的東西:
struct A {};
struct B {};
struct C {};
enum Value { a,b,c };
template < typename T >
Value get_value()
{
using namespace boost::mpl;
typedef mpl::map
<
mpl::pair< A, mpl::int_<a> >
, mpl::pair< B, mpl::int_<b> >
, mpl::pair< C, mpl::int_<c> >
> type_enum_map;
typedef typename mpl::at<type_enum_map, T>::type enum_wrap_type;
return static_cast<Value>(enum_wrap_type::value);
}
為什么不只是創建一個類型為enum的靜態成員變量並將其添加到結構中?
struct A
{
//Stuff
static MyEnum enumType; // Don't forget to assign a value in cpp
};
比你可以做的:
MyEnum e = StructA::enumType;
或者你真的想使用模板嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.