我遇到了以下在类中定义函数模板的代码:
#include <cstdint>
class foo {
public:
enum class magic_type : std::uint32_t {
START = 0,
BLUE = 0xFF000001,
RED,
};
struct header_t {
uint32_t version;
magic_type magic;
};
template <typename T>
static bool is_of_type(header_t *h)
{
return (h->magic == T::magic_type);
}
foo(uint32_t ver, foo::magic_type mag)
{
header.version = ver;
header.magic = mag;
}
header_t header;
};
我发现“is_of_type”的实现令人困惑。代码按原样编译,因此语法上必须正确。但是,此方法不会从程序的任何其他部分调用,因此我不确定该函数的目的是什么(缺少文档)。我想这个函数可能有两种解释:
根据对象的魔术类型和作为函数模板参数传递的特定枚举类型返回真/假。
例如该方法的调用将是:
foo bar(1.2, foo::magic_type::BLUE); bool temp = bar.is_of_type<foo::magic_type::BLUE>(&(bar.header));
但是,在上述情况下,我并没有真正传递类型(如 int 或 char 等)。正确的?代码无法编译。
如果魔术类型是有效枚举,则返回 true/false。
在这种情况下,我假设该函数不需要模板化,并且可以重写为:
static bool is_of_type(header_t *h) { return (h->magic == foo::magic_type); }
例如调用的:
foo bar(1.2, foo::magic_type::BLUE); bool temp = bar.is_of_type(&(bar.header));
再次出现编译错误。我尝试使用“typename”,但我的尝试是徒劳的。
有人可以帮我正确实现上述两种情况下的 is_of_type
和一个调用示例吗。
最佳答案
调用将使用明确指定的类型,它有一个名为 magic_type
的嵌套静态成员。
例如,可以这样调用:
struct test {
static foo::magic_type const magic_type;
};
foo::magic_type const test::magic_type = 42;
foo bar{1, foo::magic_type::BLUE};
bar.is_of_type<test>(bar.header);
事实上 magic_type
被使用了两次,一次用于 enum 类
,一次用于静态变量,但这非常令人困惑。
关于c++ - 函数模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130001/