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

How can I create a template version of this method that is used when template parameter is std::vector

本文关键字:创建 此方法 版本 何创建 参数 std vector      更新时间:2023-10-16

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

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

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

问候Tobias

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);

使用辅助函数,可以利用模板参数推导。这里有一个你可以适应你的程序的例子:

#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 helpern";
return {};
}
template <typename T>
static std::vector<T> helper(std::vector<T>*) {
std::cout << "Using specialized helpern";
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