gpt4 book ai didi

c++ - 具有模板返回类型的微分和嵌套函数

转载 作者:行者123 更新时间:2023-12-03 07:55:40 24 4
gpt4 key购买 nike

我想要什么:

我在使用“嵌套”(?)模板作为函数的返回类型时遇到问题。函数声明应如下所示:

// ### Generate.hpp
// return the template type
// input type is the same for all versions of generate()
template <typename T> T generate(Input in);

一些基本类型的内联定义,例如 int , bool已提供。

// ### Generate.hpp
template <> inline int generate<int>(Input in) {/*...*/}

其他(例如自定义类)可以单独实现。

// ### Custom_Class.hpp
#include "Generate.hpp" // can now make use of template

// ### Custom_Class.cpp
template <> custom::Class generate<custom::Class>(Input in) {/*...*/}

有什么问题

当我想使用这样的函数时,就会出现问题:

std::vector<int> x = generate<std::vector<int>>(...);

我需要定义这样的东西:

template <typename U> std::vector<U> generate(Input input); // differentiating via return type?

编译器 (g++) 不会让这种情况发生。

error: call of overloaded ‘generate<std::vector<int>>(Input in)’ is ambiguous

可能的原因和解决方案。

C++ 无法仅通过返回类型来区分函数。我更喜欢 OutputType func(InputType input) 形式的函数超过func (InputType input, OutputType& output) ,但我知道我可以在后者中解决这个特定场景。在那里我可以定期重载generate()对于STL容器类等,这将使编译能够区分。

问题最终归结为是否有任何模板魔法我可以调用来获得我最初想要的东西。

感谢您的帮助。

编辑 1:有关用例的更多详细信息

此处的具体用例是进一步处理词法分析器生成的标记的函数。

template <typename T> std::pair<size_t, std::optional<T>> parse_tokens(const std::vector<Token>& tokens, size_t start = 0);

这些函数获取 token vector (和起始偏移量),并且必须尝试将 token 序列的开头解析为 T 类型的对象。 。该对象(以及解析的标记数量)将被返回。

如果“已知”来自 def [int] some_data = 的标记之后的想法后面是一个整数列表,这些函数可以像 res = parse_tokens<std::vector<int>>(tokens, list_starts_here) 那样调用。有res.second对于可选值和 res.first作为推进解析器索引所需的已解析 token 的数量。

编辑2:感谢@Artyer的解决方案

我需要一些修改才能使其与容器类一起使用(必须使用 generate<T>::generate() ,而不仅仅是 generate<T>() ,否则编译器无法处理它)。我还没有实现这个解决方案(只做了一些快速测试),但我相信它可以做我想做的事,我想要的方式。它应该可以很好地扩展,我什至可以拥有所需的函数语法。

template <typename T>
struct generator;

template <typename T> T generate(std::string in) {
return generator<T>::generate(in);
}

template <>
struct generator<int> {
static int generate(std::string in) { return std::stoi(in); }
};

template <typename T>
struct generator<std::optional<T>> {
static std::optional<T> generate(std::string in)
{
if (in == "nil")
return std::nullopt;
else
return generator<T>::generate(in);
}
};

再次感谢。

最佳答案

您可以使用部分特化。由于函数不能部分专用,因此请切换到类模板:

template <typename T>
struct generator;

template <typename T> T generate(Input in) {
return generator<T>::generate(in);
}

template <>
struct generator<int> {
static int generate(Input in) { /*...*/ }
};

template <typename T>
struct generator<std::vector<T>> {
static std::vector<T> generate(Input in) { /*...*/ }
};

// ### Custom_Class.hpp
template <>
struct generator<CustomClass> {
static CustomClass generate(Input in);
};

// ### Custom_Class.cpp
CustomClass generator<CustomClass>::generate(Input in) {
return {};
}

关于c++ - 具有模板返回类型的微分和嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76086980/

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