- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用“嵌套”(?)模板作为函数的返回类型时遇到问题。函数声明应如下所示:
// ### 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容器类等,这将使编译能够区分。
问题最终归结为是否有任何模板魔法我可以调用来获得我最初想要的东西。
感谢您的帮助。
此处的具体用例是进一步处理词法分析器生成的标记的函数。
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 的数量。
我需要一些修改才能使其与容器类一起使用(必须使用 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/
我正在为仪表板创建径向仪表。以下代码是我的工作。我需要知道如何使起始 Angular 为 15 度以及如何使结束 Angular 为 165 度。请帮助我。我需要实现这个系统,所以期待完成这项工作。我
我是一名优秀的程序员,十分优秀!