【问题标题】:Function template parameter函数模板参数
【发布时间】:2014-06-09 22:22:20
【问题描述】:

我遇到了以下在类中定义函数模板的代码:

#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”的实现令人困惑。代码按原样编译,因此在语法上必须正确。但是,此方法不会从程序的任何其他部分调用,因此我不确定该函数的意图是什么(缺乏文档)。我认为该函数可能有两种解释:

  1. 根据对象的魔法类型和作为函数模板参数传递的特定枚举类型返回真/假。

    例如该方法的调用将是:

    foo bar(1.2, foo::magic_type::BLUE);
    bool temp = bar.is_of_type<foo::magic_type::BLUE>(&(bar.header));
    

    但是,在上述情况下,我并没有真正传递类型(如 int 或 char 等)。对?代码无法编译。

  2. 如果魔法类型是有效的枚举,则返回真/假。

    在这种情况下,我假设该函数不需要模板化,并且可以重写为:

    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 和一个调用示例。

【问题讨论】:

  • 顺便说一句,你为什么写new foo…而不是foo bar(1.2, foo::magic_type::BLUE)?希望您实际上没有使用带有冗余news 的此类代码。
  • @KonradRudolph 这是一个错字,我正在尝试不同的方法来编译代码。谢谢你指出。更新了我的问题。

标签: c++ c++11


【解决方案1】:

调用将使用明确指定的类型,该类型有一个名为 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 class,一次用于静态变量,这一事实非常令人困惑。

【讨论】:

  • 谢谢,我明白了。我个人不喜欢用于枚举和变量的名称,但必须像 in 一样使用代码。
猜你喜欢
  • 2013-08-02
  • 2011-05-27
  • 2021-10-18
  • 1970-01-01
  • 2021-12-23
  • 2018-12-05
  • 2018-12-16
  • 2013-04-12
相关资源
最近更新 更多