根据模板参数更改参数的 C++ 模板成员函数
c++ template member function that changes parameters depending on template parameter
>---Edit 以获取更多上下文---
假设我有一个名为TempClass的类。顾名思义,它是一个模板类。它有一堆对这个问题无关紧要的东西,但有趣的东西是一个名为addTo
的成员函数和一个作为unordered_map对象的成员变量。让我们称之为inserted
.inserted
中的所有东西都用addTo
放在那里.addTo
应该做的是创建一些对象,然后在给定键处将其插入到集合中。插入的实例应在函数内部创建,而不是传递给函数。
addTo(KeyType key, ...) // im looking for what I should put at ...
基本上,我在键后的所有事情上都被困住了。我需要一种方法可以为新创建的实例指定数据,而不必担心对象的生存期或通过调用 std::make_xxx(共享、唯一等)使事情复杂化。
这就是我希望它被称为的方式
TempClass<std::string> stringClass();
stringClass.addTo(whereToAddIt, "This was selected because of std::string");
TempClass<Vector3f> vectorClass();
vectorClass.addTo(someOtherLocation, 12.0f,12.0f,3.0f); //adds a vec(12.0f,12.0f,3.0f)
我已经看到这是这样做的,如果这是一般的良好做法,我喜欢以这种方式实现它。
我尝试过的:
- 传递指向函数的指针 ------> 有效,但很愚蠢。它需要我注意删除对象
- 在插入之前传递临时对象并复制它 ------> 有效,但我不喜欢复制对象只是为了删除它。这似乎是多余的,对于我的特定应用程序来说不是最佳的。
我以前见过这个,但我不记得在哪里(相信我,我试图记住这一点,因为如果可以的话,我可以自己查找)。请向我详细解释如何执行此操作以及它是如何工作的。
请帮我弄清楚这一点!
可以使用重载,然后在模板化类型为特定类型时启用特定重载
#include <type_traits> //for enable_if and is_same
template<typename T>
class MyClass
{
public:
template<typename = std::enable_if<std::is_same_v<T, std::string>>>
void someMember(string param1, int param2);
template<typename = std::enable_if<std::is_same_v<T, Vector3f>>>
void someMember(string param1, int param2, int param3);
};
这将选择第一个重载是 T 是 std:string,如果 T 是 Vector3f,则选择第二个重载。
编辑:查看您编辑的问题,更好的方法是将 T 的实例传递给您的 addTo 函数。喜欢:
void addTo(std::string key, T const& value);
编辑2:我想我终于知道你真正想要什么了。您需要使用可变参数模板和完美的转发。这可能看起来令人困惑,所以我会给你代码:
template<typename KeyType, typename... Args>
void addTo(KeyType key, Args&&... args)
{
//now construct the new element with:
T elem(std::forward<Args>(args)...);
}
您将需要包含实用程序标头。有关可变参数模板的更多信息,请参阅 cpp 首选项
您可以使用可变参数模板和完美转发来放置 k/v 对:
template<class K, class V>
struct foo {
template<class... Args>
void addTo(K k, Args&&... args) {
mp.emplace(
std::piecewise_construct,
std::forward_as_tuple(k),
std::forward_as_tuple(std::forward<Args>(args)...)
);
}
std::unordered_map<K, V> mp;
};
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用