C ++: создать несколько конструкторов с одинаковыми типами аргументов

Я хотел бы сделать класс с несколькими конструкторами одного типа. Поскольку это невозможно сделать напрямую, существует ли простой способ определения читаемых «фиктивных» типов, таких как класс может выглядеть так:

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 typedefs, но есть ли более удобный способ?

Спасибо

3

Решение

Стандартная библиотека делает это в разных местах, например, станд :: piecewise_construct_t. Их стандарт заключается в предоставлении …

struct something_t {};

constexpr something_t something = something_t();
5

Другие решения

Как насчет использования параметра шаблона?

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)
{

}
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;
}
2

Вы можете использовать Именованный конструктор. По сути, вы создаете статические методы с разными именами, которые возвращают новые объекты.

1
По вопросам рекламы [email protected]