我目前遇到以下问题。我有以下课程:
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)?根据我的阅读,在这种情况下不可能部分特化,但我不能完全指定向量内的类型。有人可以帮忙吗?
此致 托拜厄斯
答案 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