Я хочу, чтобы мой класс можно было использовать в std::variant
.
Простой код, который должен работать:
int main()
{
std::variant< int, A > v;
A a(1);
v = a;
}
Мой класс содержит шаблонный конструктор:
template <typename T> A( T& );
На этом этапе проблема начинается! Конструктор привязывается к вызову с std::variant
, и больше не используется A(const A&)
.
По причинам копирования и вставки полный пример здесь:
#include <iostream>
#include <variant>
class A
{
private:
int x;
public:
A( A&&) {}
A( const A& ) {}
A(){}
~A() {}
A& operator=( const A& ) { return *this;}
A& operator=( A&& ) {return *this;}
template <typename T>
A( T& t )
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
A(int _x):x{_x}{}
};
int main()
{
std::variant< int, A > v;
A a(1);
v = a;
}
Справочная информация:
Почему шаблон здесь?
Проблема начинается при использовании конструктора, который принимает тип сериализатора. Сериализатор может иметь несколько типов, в зависимости от файлов или потоков для сериализации.
Примечание: я знаю, что функциональность конструкторов отсутствует!