将std :: type_index作为模板参数传递给函数模板

Gae*_*tan 4 c++ templates

考虑以下代码(工作正常):

namespace fruit {
   struct apple{};
}

namespace language{
   struct english{};
}

typedef std::pair<std::string, std::type_index> myPairType;

std::unordered_map<std::string, myPairType> myMap =
{
    {"paul", {"likes", std::type_index(typeid(fruit::apple))} },
    {"jonas",  {"likes", std::type_index(typeid(language::english))} }
};
Run Code Online (Sandbox Code Playgroud)

现在我有以下功能模板:

template <typename T>
void GenerateProfile(void* data) {
    T* data_casted = reinterpret_cast<T*>(data);
     //the data are then set to some database
}
Run Code Online (Sandbox Code Playgroud)

在调用GenerateProfile函数时,如何传递fruit::applelanguage::english作为模板参数?

myPairType myPair = myMap.at("paul");  //This works fine
fruit::apple* ptr = nullptr; //or fruit::apple* ptr = ...
GenerateProfile<?>(ptr); 

//GenerateProfile<myPair.second>(ptr) is not compiling

//GenerateProfile<fruit::apple>(ptr) this one compile but I want to acess fruit::apple from myPair
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 7

std::type_index在运行时存储类型信息.模板是一个编译时构造.因此,您需要一种从运行时世界转换为编译时的方法:if/ else语句链.

if(myPair.second == std::type_index(typeid(fruit::apple)))
{
    GenerateProfile<fruit::apple>(...);
}
else if(myPair.second == std::type_index(typeid(language::english)))
{
    GenerateProfile<language::english>(...);
}
Run Code Online (Sandbox Code Playgroud)

显然可以使用模板元编程为您生成.

但是,您的方法是代码味道 - 您是否真的需要在运行时的类型信息?您可能想重新考虑您的设计.