【问题标题】:Template alias for type trait doesn't work类型特征的模板别名不起作用
【发布时间】:2021-08-01 23:41:11
【问题描述】:

我正在通过一个简单的自定义类型特征来练习 SFINAE:

#include <iostream>
#include <type_traits>

struct A{ int i, j; };

// Type trait
template<typename T>
struct is_class_A{ static const bool value = false; };

template<>
struct is_class_A<A>{ static const bool value = true; };

// (1)
template <typename T>
std::enable_if_t<is_class_A<T>::value> foo(const T& t){
    puts("Hi!\n");
}


int main() {
    A a;
    foo(a);   // allowed
    //foo(1); // not allowed
}

按预期工作。但是,使用模板别名

template <typename T>
using is_class_A_v = is_class_A<T>::value;


// (1)
template <typename T>
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
    puts("Hi!\n");
}

产生编译器错误:

<source>:37:22: error: missing 'typename' prior to dependent type name 'is_class_A<T>::value'
using is_class_A_v = is_class_A<T>::value;
                     ^~~~~~~~~~~~~~~~~~~~
                     typename 
<source>:40:18: error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){

另一方面,通过使用

template <typename T>
using is_class_A_v = typename is_class_A<T>::value;

我收到错误信息

error: template argument for non-type template parameter must be an expression
std::enable_if_t<is_class_A_v<T>> foo(const T& t){
                 ^~~~~~~~~~~~~~~

我在这里错过了什么?

【问题讨论】:

  • 模板变量的语法错误。你的意思是template &lt;typename T&gt; const bool is_class_A_v = is_class_A&lt;T&gt;::value;
  • value 是一个值,而不是一个类型。要为其创建别名,您需要创建一个变量模板。
  • 感谢你们俩。 @Jarod42 你能发表你的评论作为答案让我接受吗?
  • 未请求的题外话建议:不要重新发明轮子:尽可能使用标准库提供的内容。所以使用std::true_typestd::false_type和继承定义is_class_Atemplate &lt;typename&gt; struct is_class_A : public std::false_type { }; template &lt;&gt; struct is_class_A&lt;A&gt; : public std::true_type { };

标签: c++ templates sfinae


【解决方案1】:

模板变量语法为:

template <typename T> const bool is_class_A_v = is_class_A<T>::value;

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多