Как реализовать автоматическое преобразование типов c для шаблонных методов? - PullRequest
0 голосов
/ 23 марта 2020

Я использую самописные методы шаблонов для загрузки и сохранения настроек из / в 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;
}

1 Ответ

0 голосов
/ 23 марта 2020

Создайте перегруженный не шаблон для std::string, который перенаправляет в ваш метод.

template <typename Type>
void store(Type element)
{
    // A lot of lengthy storage preparation code
    // ...
    //

    // Final Storage
    globalStorage.push_back(A(element));
}

void store(const std::string& s) {
    //convert s to QString or char* or a number, as you want
    auto converted_element = ...;
    store(converted_element);
}
...