模板函数重载分辨率 T 与 SomeClass<T>



我想了解为什么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);

原因似乎很简单:如果您写

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 << "Tn";
    }
};
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;
}

如果它不能充分反映您的问题,请在评论中解释一下。

相关内容

  • 没有找到相关文章

最新更新