gpt4 book ai didi

c++模板成员函数,根据模板参数更改参数

转载 作者:行者123 更新时间:2023-11-30 03:24:51 24 4
gpt4 key购买 nike

---编辑更多上下文---

假设我有一个名为 TempClass 的类。顾名思义,它是一个模板类。它有一堆与这个问题无关紧要的东西,但有趣的是一个名为 addTo 的成员函数和一个 unordered_map 对象的成员变量。我们称它为 insertedinserted 中的所有内容都是使用 addTo 放入的。 addTo 应该做的是创建一些对象,然后将其插入到给定键处的集合中。插入的实例应该在函数内部创建,而不是传递给它。

addTo(KeyType key, ...) // im looking for what I should put at ...

基本上,我在 key 之后的所有事情都被困住了。我需要一种方法来为新创建的实例指定数据,而不必担心对象的生命周期或调用 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);

EDIT2:我想我终于知道你真正想要什么了。您需要使用可变参数模板和完美转发。这可能看起来令人困惑,所以我会给你代码:

template<typename KeyType, typename... Args>
void addTo(KeyType key, Args&&... args)
{
//now construct the new element with:
T elem(std::forward<Args>(args)...);
}

您需要包含实用程序 header 。有关可变参数模板的更多信息,请参阅 cppreference

关于c++模板成员函数,根据模板参数更改参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com