Шаблонная функция разрешения перегрузки T vs. SomeClass <T> - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу понять, почему перегрузка шаблона void handleParam(const Str& name, Table<T> value) никогда не создается (обратите внимание, что приведенный ниже код является иллюстративным). Я уверен, что есть совершенно веская причина, почему это не работает, я просто хочу понять эту причину. Я знаю (и использую) обходной путь, используя промежуточную шаблонную структуру. Но если бы что-то подобное было ниже, это значительно упростило бы мой код.

class TypeHandler
{
public:
    TypeHandler(OtherClass& bi) : _bi(bi) { }

    template <typename T> void handleParam(const Str& name, Table<T> value)
    {
        // Never gets instantiated.
    }

    template <typename T> void handleParam(const Str& name, T value)
    {

    }
}

template<typename HandlerType>
void HandleParamValue::handleTab(DataBlock& data, HandlerType& handler) {

    ...

    // Table of floats.
    Table<float> tab;
    handler.handleParam<Table<float>>(param_name, tab);

    // etc.
    ...
}

template<typename HandlerType>
void ParamStore::Iterate(HandlerType& handler) {
    for (...) {

        ...

        if (is_table(type)) {
            HandleParamValue::handleTab<HandlerType>(_datablock, handler);
        }
        else {
            HandleParamValue::handle<HandlerType>(_datablock, handler);
        }
    }
}

// Kick the whole thing off.
TypeHandler handler(_some_instance);
_param_store->Iterate(handler);

1 Ответ

1 голос
/ 29 апреля 2019

Причина, по-видимому, очень проста: если вы пишете

handler.handleParam<Table<float>>(param_name, tab);

вы явно указываете T = Table<float>. Так что handleParam(const Str& name, T value) используется. Если вы хотите использовать handleParam(const Str& name, Table<T> value), вам нужно указать T = float:

handler.handleParam<float>(param_name, tab);

Или даже

handler.handleParam(param_name, tab);

Поскольку компилятор автоматически выберет наиболее специализированную версию.

Я использовал следующий код для тестирования:

#include <iostream>
#include <vector>

class TypeHandler
{
public:

    template <typename T> void handleParam(const std::string& name, std::vector<T> value)
    {
        std::cout << "std::vector<T>\n";
    }

    template <typename T> void handleParam(const std::string& name, T value)
    {
        std::cout << "T\n";
    }
};

template<typename HandlerType>
void handleTab(const std::string& name, HandlerType& handler) {
    std::vector<float> tab;
    handler.handleParam(name, tab);
}

int main()
{
    TypeHandler t;
    handleTab("dfds", t);
    return 0;
}

Если это не отражает вашу проблему должным образом, пожалуйста, объясните это в комментарии.

...