내가 주로 std::string
로, 이전 BOOST_STRONG_TYPEDEF
을 사용하고 내가 만족스러운 결과를 얻었다 :강력한 형식 정의 (BOOST_STRONG_TYPEDEF가 절단되지 않음)
#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
없이 두 가지 유형의 객체를 비교하거나 추가 할 수 없기를 기대합니다.
- 왜 이런 일이 발생합니까?
- 각 유형에 대한 클래스를 수동으로 생성하지 않고도 기본 유형으로 유형 안전성을 달성하려면 어떻게해야합니까?
우리는 CUJ의 Matthew Wilson의 '진정한 typedef'를 사용합니다 : http://www.drdobbs.com/true-typedefs/184401633. 이 토론 (https://stackoverflow.com/questions/23726038/how-can-i-create-a-new-primitive-type-using-c11-style-strong-typedefs 및 http : // boost-users)도 참조하십시오. boost.narkive.com/XVDlErPB/boost-strong-typedef. – gast128