templates 相关问题

模板标签用于多种上下文:通用编程(尤其是C ++),以及使用模板引擎生成数据/文档。在实现繁重的问题上使用此标记时 - 标记实现编写的代码语言。

在模板中转换参数包而不包装结构

我有以下代码,它可以工作: 模板 结构包装器 { 模板 static void toNativeFunction(东西...

回答 1 投票 0

可变参数模板中类型推导的混乱

我有一个具有多个构造函数的类,一个是可变参数,一个在可变参数之前接受一个额外的可调用函数。然而,我创建的对象会导致我不会的重载决策

回答 1 投票 0

定义具有回调类型的结构体模板作为类的数据成员,同时使用类函数成员作为数据成员的回调

我收到以下示例的编译错误: 模板 结构 CallBackStruct { CallBackStruct(uint freq, Callback 回调) : freq_(freq), cb_...

回答 1 投票 0

如何:捕获输入函数异常的可变参数包装函数

我正在尝试创建一个可以传递其他函数的函数,这将捕获任何错误,但否则只是返回函数的返回值。这是我尝试过的: #包括 我正在尝试创建一个可以传递其他函数的函数,它将捕获任何错误,但否则只是返回函数的返回值。这是我尝试过的: #include <iostream> using namespace std; int fun(int input) { return input; } template <typename F, typename...Args> static auto HandledCall(const F& function, Args...args) -> decltype(function(...args)) { try { return function(...args); } catch(...) { return NULL; } } int main() { std::cout << HandledCall(fun,1) << std::endl; // this should return 1 std::cout << HandledCall(fun,-1) << std::endl; // this should return 0 return 0; } 希望意图比较明确;我希望 HandledCall 能够接收任何类型的函数,并返回其返回值(只要 NULL 在发生错误时可以隐式转换为该值)。然而,当我尝试编译上面的代码时,我收到了这些类型的错误; prog.cpp:10:78: 错误:“...”标记之前需要主表达式 静态自动 HandledCall(const F& 函数, Args...args) -> decltype(函数(...args)) 显然我没有正确地执行这个可变参数模板...有什么建议吗? 函数调用的返回类型可以使用 std::result_of 确定。 template<typename F, typename... Args> typename std::result_of<F(Args...)>::type HandledCall(F&& func, Args&&... args) { using result_type = typename std::result_of<F(Args...)>::type; try { return std::forward<F>(func)(std::forward<Args>(args)...); } catch(...) { return result_type(); } } 现场演示 有这样的事吗? #include <iostream> using namespace std; int fun(int input) { return input; } template <typename T> struct ReturnType; template<class Ret, class... Args> struct ReturnType<Ret(Args...)> { typedef Ret type; }; template <typename F, typename...Args> static auto HandledCall(const F& function, Args...args) -> typename ReturnType<F>::type { try { return function(args...); } catch(...) { return typename ReturnType<F>::type{0}; } } int main() { std::cout << HandledCall(fun,1) << std::endl; // this should return 1 std::cout << HandledCall(fun,-1) << std::endl; // this should return 0 return 0; } 更新 HandledCall的改进版本(感谢Mankarse): template <typename F, typename...Args> static auto HandledCall(const F& function, Args&&...args) -> typename ReturnType<F>::type { try { return function(std::forward<Args>(args)...); } catch(...) { return typename ReturnType<F>::type{0}; } } 这是一个基于 @Praetorian 提出的解决方案的版本,但它也适用于具有 void 返回类型的函数。其他答案无法处理这种情况的原因是 void 类型的对象的显式实例化。 template<typename T> T default_value(){return {};} template<> void default_value<void>(){} template<typename F, typename... Args> typename std::result_of<F(Args...)>::type HandledCall(F&& func, Args&&... args) { try { return std::forward<F>(func)(std::forward<Args>(args)...); } catch(...) { return default_value<typename std::result_of<F(Args...)>::type>(); } } 这样做的原因是因为标准允许在具有 void 返回类型的函数中显式返回 void 值。 包装的函数通常在编译时就已知,因此我建议通过如下所示的方式来利用它(> = c ++ 17): #include <cstdlib> #include <stdexcept> #include <type_traits> #include <utility> template <auto F, typename... Args> auto nonThrowingFunWrapper(Args... args) { using result_type = std::invoke_result_t<decltype(F), Args...>; constexpr std::integral_constant<decltype(F), F> fun_object; try { return fun_object(std::forward<Args>(args)...); } catch (...) { std::abort(); return result_type(); } } int foo(int bar) { throw std::runtime_error("foo failed"); return bar; } int main() { return nonThrowingFunWrapper<foo>(43); }

回答 4 投票 0

类模板中的非模板成员函数在可执行文件中只生成一次吗?

示例: 模板 A类{ void f() { std::cout << "f";} }; ... A a; Aa; f 是生成一次还是多次(每个项目一次...

回答 1 投票 0

带有复制构造函数的基于继承的元组

我正在创建一个基于继承的元组,类似于 https://stackoverflow.com/a/52208842/1284735 中的完成方式,但使用构造函数除外。 我认为我的常规构造函数似乎可以工作......

回答 1 投票 0

如何实现类似于 Angular 的 ngStyle 的功能,但使用 Mustache?

我在 Mustache 网站的问题跟踪器上收到以下问题: 像Angular,ngStyle,有什么办法可以添加动态样式 该问题涉及以下符号,其中

回答 1 投票 0

有模板/constexpr/C++11方法来替换X宏吗?

有没有办法使用 C++11 功能替换 Xmacro 习惯用法,并且最好不使用预处理器?我认为可以使用元组模板,但我仍在尝试了解它们是如何工作的。

回答 2 投票 0

C++中模板类可以有静态成员吗

C++中的模板类可以有静态成员吗?既然它不存在并且在使用之前是不完整的,那么这可能吗?

回答 1 投票 0

什么时候建议不要使用 Eigen::Ref 作为参数?

我目前正在编写很多接受块和表达式作为输入的函数。我通常发现使用 Refs 更容易,因为它们简单、轻量级,而且也很容易确保...

回答 1 投票 0

嵌入式视图上下文。通过观察

我有一个模板参考: @ViewChild('myTemplate', { 读取: TemplateRef, static: true }) myTemplate!: TemplateRef; 和 viewContainerRef: @ViewChild('vcr', { 读取:ViewContainerRef, s...

回答 1 投票 0

使用模板来防止缩小范围但允许扩大输入范围

我有一个类模板,旨在在浮点上进行模板化。 该类有一个方法,应该允许在需要时扩大输入(例如 float -> double),但缩小输入(即丢失

回答 1 投票 0

使用模板来防止缩小范围但允许扩大输入范围

我有一个类模板,旨在在浮点上进行模板化。 该类有一个方法,应该允许在需要时扩大输入(例如 float -> double),但缩小输入(即丢失

回答 1 投票 0

无法加载 Grapesjs 中保存的模板

无法加载 Grapesjs 中保存的模板

回答 3 投票 0

检查可调用签名参数是否是任何指针类型或可转换为特定类型?

我正在使用宏来进行编译时签名匹配,如下所示: #define ifSigMatch(sig) if constexpr (std::is_same_v(f)}), std::function 我正在使用宏来进行编译时签名匹配,如下所示: #define ifSigMatch(sig) if constexpr (std::is_same_v<decltype(std::function{std::forward<Foo>(f)}), std::function<sig>>) template <class T, class Foo> void afoo(Foo f) { ifSigMatch(void(T)) { ... } ifSigMatch(bool(T)) { ... } ifSigMatch(bool(T, int)) { ... } ... } 有没有办法处理Foo的第一个输入参数是任何指针类型的情况,或者参数可以隐式转换为T,而不需要向afoo添加更多模板参数? 最好是 c++17 或更低版本。 要处理 Foo 的第一个输入参数是任何指针类型或可隐式转换为 T 的情况,您可以将 SFINAE(替换失败不是错误)与 std::enable_if 结合使用。以下是您如何修改宏和模板函数afoo以实现此目的,而无需添加更多模板参数: #include <functional> #include <type_traits> #define ifSigMatch(sig) if constexpr (std::is_invocable_v<Foo, sig>) template <class T, class Foo> void afoo(Foo f) { ifSigMatch(T*) { ... } else ifSigMatch(std::enable_if_t<std::is_convertible_v<std::invoke_result_t<Foo, T>, T>, T>) { ... } else ifSigMatch(bool(T)) { ... } else ifSigMatch(bool(T, int)) { ... } // Add more conditions as needed // ... } 您可以使用具有类模板专门化的辅助类来获取返回类型和参数类型,然后在 constexpr 方法中使用它们来比较签名。 如果您想允许返回类型可转换为您指定的类型,可以使用 std::is_convertible_v 代替 std::is_same_v。 #include <type_traits> template <typename> struct Function; // This primary template is not defined. template <typename R, typename... Args> struct Function<R(Args...)> { template <typename Foo> constexpr bool matchesSig() { if constexpr (std::is_invocable_v<Foo, Args...>) { // only return true when the return type is EXACTLY as specified // otherwise, ifSigMatch(bool(T)) would also always imply // ifSigMatch(void(T)) to be true return std::is_same_v<std::invoke_result_t<Foo, Args...>, R>; } return false; }; }; #define ifSigMatch(sig) if constexpr (Function<sig>().template matchesSig<Foo>())

回答 2 投票 0

使用模板在一个函数中定义多个类的方法

假设我们有两个班级 A类{ 一个方法(); } B类{ B 方法(); } 方法函数做了一些重复的工作,例如,我们假设它只是返回类的副本。 我怎样才能

回答 3 投票 0

如何使用模板部分将 R quarto 中的作者左对齐到 pdf?

对于我的.qmd,我想更改部分pdf模板。我遇到了一些挑战。有人有想法吗? 左对齐标题和副标题:我通过更改部分 title.tex 来实现这一点 左对齐作者:

回答 1 投票 0

使用带有 helm 模板的 yaml 数组

我有一个表示 Helm 图表的目录结构,如下所示: Chart.yaml 值.yaml 模板/ 模板.tpl 值.yaml: foo:[“酒吧”,“巴兹”] FO: - 酒吧 - 巴兹 圣殿...

回答 1 投票 0

如何更改 phpstorm 自定义构造函数模板?

我使用 phpstorm 代码 > 生成... > 构造函数来获取: 函数 __construct() { } 但我想要: 公共函数 __construct() { } 如何更改模板?找不到任何东西并且...

回答 2 投票 0

如何在java中模板化JSON

我的用例是我有一个 json 文件,但我只需将其中的几个共享给客户端。 例如:考虑源 json 文件,如下所示。 { “名称”:“XYZ”, “年龄”:24, “教育”: { ”

回答 6 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.