gpt4 book ai didi

c++ - 类定义之外的部分模板特化定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:24 26 4
gpt4 key购买 nike

我在模板特化方面遇到了一些麻烦。我一直在寻找其他答案,并认为我在这个线程中找到了解决方案 - Partial template specialization outside class definition - 然而事实证明这并不能解决我的问题。

我正在尝试根据枚举值进行一些模板特化,以消除对不必要的运行时多态性的需求。当我在类主体中定义模板函数时,它工作正常,但是当我将定义移到类模板之外时,编译器无法匹配签名。

我的实际场景是与一个使用命名对象的 API 交互,我用一个枚举值表示每个对象类。这些对象彼此没有直接关系,但它们具有非常相似的资源管理/操作机制。我最初尝试使用 traits,但由于我有时需要使用完全不同的函数签名,traits 并没有像我希望的那样工作。

无论如何,这是我面临的问题的简化示例。

Dog bark 能用,因为类定义里定义了,Cat meow 不行,因为找不到meow 的声明。如果我合并定义和声明 cat meow 将起作用。

有没有办法以这种方式部分指定模板?原因是我希望将对外部 API 的依赖保存到源文件而不是头文件中。

enum class AnimalType { Dog, Cat, };
template<AnimalType Type> struct A;

template<>
struct A<AnimalType::Dog>
{
// OK
void bark() { std::cout << "woof"; }
};

template<>
struct A<AnimalType::Cat>
{
void meow();
};

// Cannot match
template <>
void A<AnimalType::Cat>::meow()
{
}

GCC 4.9 提示

scratchpad/animal.h:105: error: template-id 'meow<>' for 'void <(AnimalType)1>::meow()' does not match any template declaration
void A<AnimalType::Cat>::meow()

谢谢

最佳答案

这个:

template<>
struct A<AnimalType::Cat> {
void meow();
};

使用非模板方法 声明模板特化。但是这个:

template <> void A<AnimalType::Cat>::meow()

隐含了一个模板方法的特化。自 A<AnimalType::Cat> 已经完全特化,它不需要 template <>在这里。

改用这个:

void A<AnimalType::Cat>::meow() {
std::cout << "meow\n";
}

并考虑比较这个模板方法:

template<>
struct A<AnimalType::Cat> {
template <AnimalType> void greet();
};
template <>
void A<AnimalType::Cat>::greet<AnimalType::Cat>() {
std::cout << "purr\n";
}
template <>
void A<AnimalType::Cat>::greet<AnimalType::Dog>() {
std::cout << "flee\n";
}

关于c++ - 类定义之外的部分模板特化定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31878149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com