当模板参数为std::vector时,如何创建此方法的模板版本
How can I create a template version of this method that is used when template parameter is std::vector
我目前有以下问题。我有以下课程:
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
相关文章:
- 如何缩短此方法签名?
- 如何创建template_back方法
- 错误"pure virtual method called",当此方法已被覆盖时
- C++:为什么此方法每次都返回相同的随机数?
- 是否可以简化此方法以安装和导出基于 CMake 的项目?
- 编译错误,未创建函数/方法! 对于 brms 模型
- 如何使用创建类创建类方法
- 如何从JSON String创建工厂方法
- 我写了此方法来删除链接列表的重复元素,但它显示了分段故障,原因
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- 编译器是否能够内联此方法
- 为什么此方法的返回被破坏
- 我在哪里可以从C 中的单链接列表中创建此函数到搜索元素时犯了错误
- 如何为我的 Vulkan 类创建此通用数据结构字段
- 如何在Qt Creator中从继承的类自动创建虚拟方法
- 如何编写此方法的定义,我收到错误
- 超级级别的方法称为super具有sub的str attr 实例在循环 实例中创建的方法是作为super的指针存储在向
- 创建此指针后会发生什么情况
- 当模板参数为std::vector时,如何创建此方法的模板版本
- 从其他类调用此方法会创建冲突读取