gpt4 book ai didi

c++ - 模板参数绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 21:09:59 27 4
gpt4 key购买 nike

我想要的是类似于 std::bind 的函数,但用于模板。假设我有一个模板,它需要一个带有一组已定义参数的模板模板。现在我有了另一个可以工作但有更多参数的模板,所以我需要将这个复杂的模板转换为一个带有绑定(bind)参数的更简单的模板。

为此,我创建了一个定义别名模板的模板。

如果我将此绑定(bind)模板与具体类型一起使用,效果会很好。但是如果我用另一个模板参数实例化绑定(bind)模板,gcc 和 clang 会假定别名不是模板模板。我知道它成为一个从属名称,但没有什么比模板的 typename 消歧器更好的了。

对于 icc 和 msvc 这工作正常。

template<
template<typename> typename Template
>
class ATypeWhichNeedsATemplateTemplate
{
};

template<typename A, typename B>
class AComplexTemplate
{
};

template<
template<typename...> typename ATemplate
,typename... Args
>
class Binder {
public:
template<typename T>
using type = ATemplate<T, Args...>;
};

template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::type
>
{
};

see on godbolt

clang 提示:

<source>:30:5: error: template argument for template template parameter must be a class template or type alias template

Binder<AComplexTemplate, T>::type

^

gcc 说了类似的话:

<source>:31:1: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class Template> class ATypeWhichNeedsATemplateTemplate'

>

^
<source>:31:1: note: expected a class template, got 'Binder<AComplexTemplate, T>::type'

最佳答案

type是依赖模板名称。你需要拼写成 Binder<AComplexTemplate, T>::template type , 一世。即:

template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::template type
>
{
};

修复了 godbolt 示例:https://godbolt.org/z/7nJtAU

关于c++ - 模板参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56392905/

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