gpt4 book ai didi

c++ - 如何为多种类型专门化模板类的非模板成员函数?

转载 作者:行者123 更新时间:2023-11-30 02:18:32 25 4
gpt4 key购买 nike

我正在努力研究为多种类型部分特化一个成员函数所需的语法。这是我所拥有的:

#include <cstdint>
#include <string>

class Property
{
public:
virtual int read(uint8_t *) = 0;
};

template<typename T>
class PropertyValue
{
T value_;
public:
int read(uint8_t *);
};

// specialized for std::string
template<>
int PropertyValue<std::string>::read(uint8_t *buf) { /* put string-value to buf */}

现在我想专门针对不同的枚举类型读取函数。我尝试了 enable_ifis_same 的组合,看起来很有希望,然后将其放入模板声明中(编译器告诉我现在有 2 个模板参数,而预期有 1 个)。

将它放在类定义中也不起作用。外面……好吧,这是我目前拥有的。

// specialize for some enums
template<typename T>
typename std::enable_if<std::is_same<T, enum Enum1>::value ||
std::is_same<T, enum Enum2>::value, int>::type
PropertyValue<T>::read(uint8_t *buf)
{
return encode_enum(buf, value_);
}

我的想法哪里错了?

编辑:像这样编写编译和工作:

template<>
int PropertyValue<Enum 1>::read(uint8_t *buf)
{
return encode_enum(buf, value_);
}

template<>
int PropertyValue<Enum 2>::read(uint8_t *buf)
{
return encode_enum(buf, value_);
}

最佳答案

PropertyValue::value 本身不是模板。它不是模板类,也不是模板函数。它是模板类的成员,这与模板本身不同。

你必须专攻整个类(class)。

template<>
class PropertyValue<std::string>
{
std::string value_;
public:
int read(uint8_t *)
{
// Your specialization goes here.
}
};

即使 read() 本身是一个模板,您仍然必须特化它的类,然后才能特化模板类的模板成员。

当然,如果您的模板类有许多其他成员和方法,那么它们中的每一个都必须在这里专门化,从而导致大量代码重复。届时,您将面临重构重复代码的多种选择。最佳方法取决于具体细节。

但这就是它完成的方式......

编辑:一种常见的方法是使用辅助模板类:

template<typename T> class PropertyValue; // Forward declaration

template<typename T> class do_read {
public:

static int do_it( PropertyValue<T> &me, uint8_t *p )
{
// your default implementation
}
};

template<> class do_read<std::string> {
public:

static int do_it( PropertyValue<std::string> &me, uint8_t *p )
{
// your specialization
}
};


template<typename T>
class PropertyValue
{
T value_;
public:
int read(uint8_t *p)
{
return do_read<T>::do_it(*this, p);
}
};

关于c++ - 如何为多种类型专门化模板类的非模板成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52026917/

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