如何强类型定义非基本类型?

Tre*_*key 8 c++ boost types typedef c++11

请注意以下程序,其中函数接受期望类型和作为该类型的typedef的任何类型.

//a user defined type
class Widget{};

//a function that takes a Widget
void function (Widget w){}

int main(){

    //make a typedef (this is C++11 syntax for a typedef. It's the same thing)
    using Gadget = Widget;

    //make the two "different types" (well.. they're not really different as you will see)
    Widget w;
    Gadget g;

    //call a function that should ONLY accept Widgets
    function(w); //works (good)
    function(g); //<- works (I do not want this to compile though)

}
Run Code Online (Sandbox Code Playgroud)

如您所见,typedef实际上并不区分新类型.我想改为从类型继承:

//inherit instead
class Gadget: public Widget{};

//make the two "different types"
Widget w;
Gadget g;

//call the function that should ONLY accept widgets
function(w); //works (good)
function(g); //<- works (I do not want this to compile though)
Run Code Online (Sandbox Code Playgroud)

同样的问题.
看看提升,我想尝试一个强大的typedef:

#include <boost/serialization/strong_typedef.hpp>

//a user defined type
class Widget{};

//a function that takes the user defined type
void function (Widget w){}

int main(){

    //try to strongly typedef
    BOOST_STRONG_TYPEDEF(Widget, Gadget)

    //make the two "different types"
    Widget w;
    Gadget g;

    //call the function that should ONLY accept widgets
    function(w);
    function(g);

}
Run Code Online (Sandbox Code Playgroud)

编译错误:

In member function ‘bool main()::Gadget::operator==(const main()::Gadget&) const’:
error: no match for ‘operator==’ (operand types are ‘const Widget’ and ‘const Widget’)
  BOOST_STRONG_TYPEDEF(Widget, Gadget)
  ^
In member function ‘bool main()::Gadget::operator<(const main()::Gadget&) const’:
error: no match for ‘operator<’ (operand types are ‘const Widget’ and ‘const Widget’)
  BOOST_STRONG_TYPEDEF(Widget, Gadget)
  ^
Run Code Online (Sandbox Code Playgroud)

显然BOOST_STRONG_TYPEDEF仅适用于基本类型.
我试图再次继承,但停止隐式转换:

//I want the functionality, but these are NOT the same type!
class Gadget: public Widget{
    operator Widget() = delete;
};
Run Code Online (Sandbox Code Playgroud)

那也行不通.

问题:

  1. 为什么boost strong_typedef只适用于原始类型?
  2. 我如何'typedef'非原始类型以获得类似于boost strong_typef的功能?

gre*_*rep 6

基本上你需要两个具有相同行为的无关类.我会使用参数化模板:

template<int tag> class WidgetGadget { ... };
typedef WidgetGadget<0> Widget;
typedef WidgetGadget<1> Gadget;
Run Code Online (Sandbox Code Playgroud)


Dan*_*rey 1

也许你可以使用私有继承和一些usings?

class Gadget : Widget { using Widget::Widget; using Widget::foo; ... };
Run Code Online (Sandbox Code Playgroud)