当前位置: 首页 > 知识库问答 >
问题:

template中的默认参数->template参数涉及template参数

陆高峰
2023-03-14

我想定义一个特征,它告诉一个复杂的表示形式是否是一个结构数组,其中的实际值从来不是AoS,因此不需要用户定义的指定,但对于复杂的表示形式,您总是需要一个:

/**
 * Evahtml" target="_blank">luates to a true type if the given complex type is an Array of Structs, false otherwise
 * Defaults to false for Real values
 */
template< typename T, bool T_isComplex = IsComplex<T>::value >
struct IsAoS: std::false_type{};

/**
 * Undefined for (unknown) complex types
 */
template< typename T >
struct IsAoS< T, true >;

专门化是通过从std::true/false_type派生而以std方式完成的。

问题是:使用这个实现,我会得到“template argument invidents template parameter”错误(在链接的问题中解释了这一点),但是如果我切换到类型(第一个模板中的ommit“::value”,第二个模板中的true更改为true_type),复杂类型将不再与第二个模板匹配,因为唯一的derive from std::true_type,而不是std::true_type。

我能想到的唯一解决方案是使用表达式SFINAE,并将主模板的第二个参数更改为默认void和实际情况的enable_if(iscomplex==false)。还有更好的?

共有1个答案

易研
2023-03-14

假设ISAOS 期望的行为是:

  • 如果iscomplex ::value false,则默认为false_type
  • 否则,除非用户提供专门化,否则为错误。

使用static_assert实现非常简单;不需要默认模板参数:

template< typename T >
struct IsAoS: std::false_type {
    static_assert(!IsComplex<T>::value, "A user specialization must be provided for Complex types");
};
namespace detail {

    template< typename T, bool T_isComplex = IsComplex<T>::value >
    struct IsAoS_impl: std::false_type{};

    /**
     * Undefined for (unknown) complex types
     */
    template< typename T >
    struct IsAoS_impl< T, true >;
}

template<class T> struct IsAoS : detail::IsAoS_impl<T> {};
 类似资料:
  • 我有这样的情况 这是我自己的Vector类,构造函数模拟了Vector的行为(u可以通过使用interator提供的数据范围来构造它),但增加了一个要求,即容器是与正在构造的容器相同类型的模板。我有错误 5.cpp:16:36:错误:调用“Vector::Vector(Vector::Iterator,Vector::Iterator)”没有匹配函数5.cpp:16:36:注意:候选项是:包含在5

  • 模板参数除了类型外(包括基本类型、结构、类类型等),也可以是一个整型数(Integral Number)。这里的整型数比较宽泛,包括布尔型,不同位数、有无符号的整型,甚至包括指针。我们将整型的模板参数和类型作为模板参数来做一个对比: template <typename T> class TemplateWithType; template <int V> class TemplateWit

  • 问题内容: 当我运行它时,它拒绝“ def a(…”,并用红色突出显示“(”。我不知道为什么。 问题答案: 让我在这里澄清两点: 首先,非默认参数不应跟随默认参数,这意味着您无法在函数中定义。在函数中定义参数的正确顺序为: 位置参数或非默认参数,即 关键字参数或默认参数,即 仅关键字参数,即 var-keyword参数,即 是位置参数 是可选参数 是关键字参数 是列表参数 仅限关键字 是var-k

  • 我将我的项目从Django 1.11升级到2.2,做了所有的更改,但带来了新的错误,说login()得到了一个意想不到的关键字参数template_name。它与Django 1.11的前一个版本运行良好(所有其他网址都在工作,只有着陆页给出了错误)。我找不到任何关于这个问题的参考资料。以下是该问题的错误、网址和视图。 着陆\urls.py 着陆\views.py C:\Users\User\ve

  • 我们知道,在调用函数时如果不指定某个参数, Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。这样的话,即便调用函数时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值。 Python 定义带有默认值参数的函数,其语法格式如下: def 函数名(...,形参名,形参名=默认值):     代码块

  • 本文向大家介绍Lua 默认参数,包括了Lua 默认参数的使用技巧和注意事项,需要的朋友参考一下 示例 该功能是一个简单的功能,并且效果很好。但是,如果我们刚刚打电话会发生什么sayHello()呢? 那不是很好。有两种解决方法: 您立即从函数返回: 您设置默认参数。 为此,只需使用此简单表达式 这个成语name = name or "Jack"之所以有效,是因为or在Lua中发生短路。如果左侧的项