gpt4 book ai didi

c++ - 有没有办法提示用户使用什么数据类型作为模板 C++

转载 作者:行者123 更新时间:2023-12-01 14:36:40 27 4
gpt4 key购买 nike

我正在制作一个带有动态内存和模板的简单双向链表,它应该接收用户输入以生成它。现在我想提示用户列表是由整数、 float 、 double 还是字符组成的。这可能吗?

template <class T>
class le
{
nodo<T>* head = nullptr;
bool (*comp)(T, T);
public:
le(bool (*c)(T, T) = ascendente) {
comp = c;
}
void add(T valor);
void remove(T valor);
bool find(T bus, nodo<T>*& pos);
void print();
~le();
};

我认为的一个替代方案是为每种数据类型声明 4 个列表,并为每个列表创建一个指针,但如果有直接的方法可以做到这一点,它将节省内存并且速度会更快。

le<int> leInt;
le<char> leChar;
le<float> leInt;
le<double> leChar;

最佳答案

处理这个问题最直接的方法是使用 adapter pattern其中适配器都继承自“接口(interface)”类型(仅限纯虚拟方法)。为此,您需要知道需要对每个列表执行哪些调整操作。

例如,给定单个操作“将项目添加到列表”,我们可以使用 std::string作为参数类型,因为这很可能是输入的类型。因此,我们的基本适配器接口(interface)如下所示:

class le_adapter {
public:
virtual ~le_adapter() = default;
virtual bool add(std::string const &) = 0;
};

现在我们需要为每个列表类型实现适配器。值得庆幸的是,模板可以在这方面帮助我们:

template <typename T>
class le_adapter_impl : public le_adapter {
public:
virtual bool add(std::string const &) override;

le<T> & get();

private:
le<T> list;
};

template <typename T>
bool le_adapter_impl<T>::add(std::string const & str) {
// Naive implementation; should do more error checking.
T value;
std::istringstream source{str};

if (source >> value) {
list.add(value);
return true;
}

return false;
}

template <typename T>
le<T> & le_adapter_impl<T>::get() {
return list;
}

现在我们有了一个适配器,我们可以将它放在给定类型列表的前面,并通过 le_adapter 以多态方式使用它。无需知道其中包含哪种列表。 (请注意,“适当的”适配器将存储引用/指针而不是对象,但让适配器拥有列表可简化此示例。)

现在,您可以根据用户的输入构建不同的适配器。例如,您可以将工厂函数存储在映射中:

std::map<std::string, std::function<std::unique_ptr<le_adapter>()>> factories{
{"int", std::make_unique<le_adapter_impl<int>>},
{"char", std::make_unique<le_adapter_impl<char>>},
{"float", std::make_unique<le_adapter_impl<float>>},
{"double", std::make_unique<le_adapter_impl<double>>},
};

现在您有一张 map ,您可以根据用户输入的内容分配适配器:

std::string input{"int"}; // Example user input

auto i = factories.find(input);
if (i != factories.end()) {
auto adapter = i->second(); // Creates the desired adapter.

adapter->add("123"); // This would also be user input
} else {
// Handle invalid selection
}

现在我们有 adapter这是 std::unique_ptr<le_adapter> .您不必知道使用哪个特定实现即可使用基接口(interface)上定义的虚拟方法。

适配器仅与其基本接口(interface)一样有用;如果您需要支持其他操作,则必须在该接口(interface)上定义它们,并且它们必须具有通用参数或返回值才能发挥作用。

如果您需要执行大量操作/计算,这将受益于了解 T 的类型那么您可以使用模板函数并使用 visitor pattern 将其应用于适配器通过重载的仿函数。 (或者在适配器中作弊并这样做,尽管这可能被认为违反了关注点分离。)

关于c++ - 有没有办法提示用户使用什么数据类型作为模板 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62767720/

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