模板函数内部的extern函数模板声明

编程语言 2026-07-11

我有一个模板函数,所有的实例化都将通过生成的模板特化代码来完成。

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>());
}

LIVE

语法错误:'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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章