Я использую самописные методы шаблонов для загрузки и сохранения настроек из / в Qt QSettings
. QSettings
получение / возврат данных типа QVariant
и QVariant
имеет конструкторы, принимающие базовые c типы, такие как int
и double
, но не std::string
.
* 1011 Поэтому мой шаблонный метод может быть легко использован для
int
и
double
, но при использовании
std::string
я получаю сообщения об ошибках компиляции, что нет соответствующего вызова функции, потому что нет известного преобразования из
std::__cxx11::basic_string<char>
в типы принимается конструкторами
QVariant
.
Конечно, я могу решить эту проблему, написав специализацию моего метода-шаблона. Тем не менее, я не решаюсь сделать это, потому что есть ровно один маленький вызов, который вызывает проблему. Остальная часть кода подходит для всех типов.
Можно ли обеспечить преобразование типов, определяемое пользователем, так, чтобы компилятор мог автоматически использовать его для преобразования типов при компиляции метода шаблона?
Вот минимальный пример, который пытается воспроизвести ситуацию без классов Qt:
#include <string>
#include <vector>
class A
{
public:
A(int)
{
}
A(double)
{
}
};
std::vector<A> globalStorage;
template <typename Type>
void store(Type element)
{
// A lot of lengthy storage preparation code
// ...
//
// Final Storage
globalStorage.push_back(A(element));
}
// TODO: A specialization of the template method solves the problem. Is there
// another way to provide a user-defined type conversion?
template <>
void store<std::string>(std::string element)
{
// A lot of lengthy storage preparation code
// ...
//
globalStorage.push_back(A(std::stoi(element)));
}
int main()
{
double number1 = 1.0;
int number2 = 2.0;
float number3 = 3.0;
store (number1);
store (number2);
store (number3);
std::string number4 = "4";
store(number4);
return 0;
}