c++ - 根据模板枚举参数更改行为

标签 c++ templates enums template-specialization

我有一个可以处理 2 种不同协议(protocol)的通信类。协议(protocol)由枚举模板变量选择。 现在,2 个协议(protocol)中的一个仅支持 2 字节值,而另一个支持 4 字节值。 通信是通过模板成员函数完成的。如何更改 static_assert 使其占用 2 或 4 个字节,具体取决于类特化(= 选择的协议(protocol))?

#include <iostream>
#include <math.h>

enum Protocol { P1, P2 };


template <Protocol P>
class Communicator {
  public:
    template <typename T>
    void communicate(T arg) {
      static_assert(sizeof(arg) <= sizeof(float), "argument size must be <= 4 bytes");
      float value = (float)arg;
      uint8_t length = sizeof(arg);  //length in bytes
      _communicate(value, length);
    }

    void _communicate(float f, uint8_t length) {
      std::cout << f;
    }
};

编辑:我只能选择 1 个答案是正确的。尽管我从 Roy 那里学到了最多,但我还是选择了 MM 的答案,因为它使事情尽可能简单。 (虽然都赞成)

最佳答案

有几种方法可以解决这个问题……这里是一种方法:

template<Protocol P>
size_t value_size();

template<> size_t value_size<P1>() { return 2; }
template<> size_t value_size<P2>() { return 4; }

// ... inside your other function
static_assert(sizeof(arg) <= value_size<P>(), 

关于c++ - 根据模板枚举参数更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167587/

相关文章:

c++ - 最优雅的可变函数

c++ - Union-find 方法性能,迭代与递归

时间:2019-03-17 标签:c++: Defferentiate templates in an if statement

c++ - 测试内联(模板化)函数的返回值(它本身正在测试)是否针对一次测试进行了优化?

C++11 模板方法中的自动返回类型

通过设置为字符串文字初始化的 C++ 大小的 char 数组导致数组边界溢出

c++ - const 方法中的非常量 lambda 捕获

C++,具有方法和枚举类型的类-方法和枚举值可以具有相同的名称吗?

枚举中的 Javascript 枚举

ruby-on-rails - 如何检查模型枚举中的多个值