模板函数内部的extern函数模板声明
我有一个模板函数,所有的实例化都将通过生成的模板特化代码来完成。
template <typename Type>
std::vector<std::string> get_members()
{
static_assert(dependent_false_v<Type>, "Use explicit specialization");
return {};
}
template <>
std::vector<std::string> get_members<MyStruct>()
{
return { "my_int", "my_double" };
}
该函数将被另一个模板函数/类调用。我不想为所有实例化都声明 extern。如果可能的话,应该由使用它的函数/类来声明它。
template <typename Type>
void print_members()
{
extern template std::vector<std::string> get_members<Type>();
std::print("{}\n", get_members<Type>());
}
语法错误:'template' 在这里意外出现
有没有办法在不为所有类型声明的情况下实现?
extern template std::vector<std::string> get_members<MyStruct>();
print_members<MyStruct>();
解决方案
如果没有主模板定义,我认为你可能不会违反ODR(单定义规则):
template <typename T>
std::vector<std::string> get_members(); // No definition, should be specialized
template <typename Type>
void print_members()
{
std::print("{}\n", get_members<Type>());
}
并且在一个cpp文件中
struct MyStruct;
template <>
std::vector<std::string> get_members<MyStruct>()
{
return { "my_int", "my_double" };
}
Demo.
不过我怀疑这段代码是否合法。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。