我想创建一个具有相同类型的几个构造函数的类。由于这不可能直接实现,是否有一种简单的方法来定义可读的“虚拟”类型,例如类看起来像:
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,但是有更方便的方法吗?
由于
答案 0 :(得分:5)
标准库实际上在不同的地方执行此操作,例如std::piecewise_construct_t。他们的标准是提供......
struct something_t {};
constexpr something_t something = something_t();
答案 1 :(得分: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)
{
}
答案 2 :(得分:2)
是的,您可以将调度标记为任意重载构造函数:
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;
}
答案 3 :(得分:1)
您可以使用Named constructor idiom。基本上,您使用不同的名称创建返回新对象的静态方法。