4

我想用几个相同类型的构造函数创建一个类。由于这不可能直接实现,是否有一种简单的方法来定义可读的“虚拟”类型,例如类可能如下所示:

class Myclass
{
    MyClass(Orange, std::string & name, float size);
    MyClass(Apple, std::string & name, float size);
    MyClass(Banana, std::string & name, float size);
}

我可以将 Orange、Apple 和 Banana 定义为 struct typedef,但有更方便的方法吗?

谢谢

4

4 回答 4

5

标准库实际上在不同的地方执行此操作,例如std::piecewise_construct_t。他们的标准是提供...

struct something_t {};

constexpr something_t something = something_t();
于 2014-04-04T21:00:28.440 回答
3

是的,您可以标记调度以任意重载构造函数:

struct Orange{};
struct Apple{};
struct Banana{};

class MyClass
{
    MyClass(Orange, std::string & name, float size){}
    MyClass(Apple, std::string & name, float size){}
    MyClass(Banana, std::string & name, float size){}
};

int main()
{
    std::string name("Fred");   
    MyClass myObject(Orange(), name, 10.0f);

    return 0;
}
于 2014-04-04T21:03:13.623 回答
3

使用模板参数怎么样?

struct Orange {};
class MyClass
{
public:
    template<typename CT>
    MyClass(CT, std::string & name, float size);
};

template<>
MyClass::MyClass<Orange>(Orange, std::string & name, float size)
{
    // The orange case
}

可以用作:

int main()
{
    std::string name("Fred");
    MyClass myObject(Orange(), name, 12.0f);
    return 0;
}

在上面的形式中,它只是一个更复杂的标签调度方法。
优点在于您可以在模板参数中添加额外的细节并基于它们创建通用构造函数:

struct Orange { static const int pips = 7; };
struct Banana { static const int pips = 1; };

class MyClass
{
    int pips;
public:
    enum ConstructorType {Orange, Apple, Banana};
    template<typename CT>
    MyClass(CT, std::string & name, float size);
};

template<typename CT>
MyClass::MyClass(CT, std::string & name, float size)
: pips(CT::pips)
{

}
于 2014-04-04T21:10:53.377 回答
1

您可以使用命名构造函数习惯用法。基本上,您创建具有不同名称的静态方法,这些方法返回新对象。

于 2014-04-04T21:00:04.163 回答