原始类型的强类型(BOOST_STRONG_TYPEDEF没有切割)

Strong typedef for primitive types (BOOST_STRONG_TYPEDEF is not cutting it)

本文关键字:TYPEDEF STRONG 强类型 BOOST 原始 类型      更新时间:2023-10-16

我以前曾经使用过BOOST_STRONG_TYPEDEF,主要是用std::string,我得到了令人满意的结果:

#include <boost/serialization/strong_typedef.hpp>
#include <iostream>
BOOST_STRONG_TYPEDEF(std::string, TIMER_ID)
BOOST_STRONG_TYPEDEF(std::string, PROCESS_ID)
int main()
{
    TIMER_ID t_id("Timer");
    PROCESS_ID p_id("Process");
    if (t_id == p_id)
        std::cout << "They are equal!" << std::endl;
}

以前的代码无法按预期进行编译:

In file included from /usr/include/boost/serialization/strong_typedef.hpp:26:0,
                 from types.cpp:1:
/usr/include/boost/operators.hpp: In instantiation of ‘bool boost::operator==(const std::__cxx11::basic_string<char>&, const PROCESS_ID&)’:
types.cpp:12:14:   required from here
/usr/include/boost/operators.hpp:144:64: error: no match for ‘operator==’ (operand types are ‘const PROCESS_ID’ and ‘const std::__cxx11::basic_string<char>’)
      friend bool operator==(const U& y, const T& x) { return x == y; }

但是,此代码可以很好地编译:

#include <boost/serialization/strong_typedef.hpp>
#include <iostream>
BOOST_STRONG_TYPEDEF(unsigned int, TIMER_ID)
BOOST_STRONG_TYPEDEF(unsigned int, PROCESS_ID)
int main()
{
    TIMER_ID t_id(12);
    PROCESS_ID p_id(12);
    if (t_id == p_id)
    {
        std::cout << "They are equal!" << std::endl;
        std::cout << "Their sum is " << t_id + p_id << std::endl;
    }
}

这似乎根本不强!我希望没有static_cast的两种不同类型的对象无法比较或添加对象

  • 为什么会发生这种情况?
  • 如何使用原始类型完成类型的安全性,而无需为每种类型手动创建类?
  • 阅读http://www.boost.org/doc/libs/1_63_0/libs/serialization/doc/strong_typedef.html,看来您的示例使用Boost编译,因为Boost创建的类型可以替换为可比的原始类型。

  • 来自FluentCpp的Johnathan Boccara在其GitHub上提供了强大类型的实现,应该是您想要的:

#include <cassert>
#include "NamedType/named_type.hpp"
int main() {
  using TIMER_ID =
      fluent::NamedType<unsigned int, struct TimerIdTag, fluent::Comparable>;
  using PROCESS_ID =
      fluent::NamedType<unsigned int, struct ProcessIdTag, fluent::Comparable>;
  TIMER_ID a(123);
  PROCESS_ID b(456);
  assert(a == a);
  // assert(a == b); doesn't compile
  return 0;
}