如何在模板参数为std :: vector时创建此方法的模板版本

时间:2014-02-15 22:22:45

标签: c++ templates c++11

我目前遇到以下问题。我有以下课程:

class Container
{
public:
    explicit Container(Resolver& r);
    ~Container();

    template <typename Interface>
    Interface& Create();

    size_t GetNumberOfManagedObjects();
private:

    template <typename Interface>
    Interface& InternalCreate();

    Resolver& m_resolver;
    std::vector<std::pair<std::function<void(void*)>,intptr_t>> m_deleter;
    std::unordered_map<std::string,intptr_t> m_singletons;
};

现在我需要一个版本InternalCreate,当模板参数'Interface'的类型是std :: vector时使用,我需要一个其他方式使用的版本。这可能吗(例如使用std :: enable_if)?根据我的阅读,在这种情况下不可能部分特化,但我不能完全指定向量内的类型。有人可以帮忙吗?

此致 托拜厄斯

2 个答案:

答案 0 :(得分:1)

SFINAE似乎是正确的解决方案。您可以创建一个特性,当它收到的类型是向量时返回std::true_type

template<typename Container>
struct is_vector : std::false_type { };

template<typename T>
struct is_vector<std::vector<T>> : std::true_type { };

现在你可以为这样的矢量启用重载:

template <typename Interface>
    Interface& InternalCreate(
           typename std::enable_if<is_vector<Interface>{}>::type* ptr = nullptr);

template <typename Interface>
    Interface& InternalCreate(
          typename std::enable_if<!is_vector<Interface>{}>::type* ptr = nullptr);

答案 1 :(得分:0)

使用辅助函数,您可以利用模板参数推导。以下是您可以适应您的计划的示例:

#include <iostream>
#include <vector>
class Foo {
  public:
    template <typename T>
    T Create() {
        return helper(static_cast<T*>(nullptr));
    }
  private:
    template <typename T>
    static T helper(T*) {
        std::cout << "Using generic helper\n";
        return {};
    }
    template <typename T>
    static std::vector<T> helper(std::vector<T>*) {
        std::cout << "Using specialized helper\n";
        return {};
    }
};
int main() {
    Foo f;
    f.Create<int>();
    f.Create<int*>();
    f.Create<std::vector<int>>();
    f.Create<std::vector<int>*>();
    f.Create<std::vector<std::vector<int>>>();
    return 0;
}

输出:

Using generic helper
Using generic helper
Using specialized helper
Using generic helper
Using specialized helper