无法从 C++ 模板类中的枚举推断类型

Failing to deduce type from enum in a C++ template class

提问人:jerin 提问时间:7/14/2023 更新时间:7/14/2023 访问量:49

问:

我有以下简化的示例,我尝试从我创建的枚举 () 映射到本机类型 ()。我正在尝试根据这个答案进行扩展。f32float

#include <any>
#include <iostream>

enum class Scalar {
    f32,
    i32
};

template <enum Scalar> struct DeduceNative;

template <>  struct DeduceNative<Scalar::f32> {
    using type = float;
};

template <>  struct DeduceNative<Scalar::i32> {
    using type = int;
};


void example(){
    DeduceNative<Scalar::i32>::type izero(0);
    DeduceNative<Scalar::f32>::type fzero(0);
    
    std::cout << izero << " ";
    std::cout << fzero << "\n";
}

#if 1
template <enum Scalar>
struct Zero {
    DeduceNative<Scalar>::type value() { return 0; }
};

void working_draft(){
    Zero<Scalar::f32> fzero;
    Zero<Scalar::f32> izero;
    std::cout << fzero.value() << " " <<  izero.value() << std::endl;
}
#endif

int main(){
    example();
    return 0;
}

无法编译(出现以下错误),而 正在按预期工作。为什么在万一中没有正确推断类型?working_draftexampleworking_draft

<source>:24:24: error: type/value mismatch at argument 1 in template parameter list for 'template<Scalar <anonymous> > struct DeduceNative'
   24 |     DeduceNative<Scalar>::type value() { return 0; }
C++ 模板 template-argument-deduction

评论


答:

4赞 463035818_is_not_an_ai 7/14/2023 #1

你想要这个

template <Scalar sc>
struct Zero {
    typename DeduceNative<sc>::type value() { return 0; }
};

Zero具有非类型模板参数。 是一个,但它是未命名的。然后你尝试了,这毫无意义。 不是模板参数的名称,而是类型的名称。您还需要关键字,因为它是依赖名称。enum ScalarDeduceNative<Scalar>Scalarenumtypename

PS:你的代码中没有推导任何内容。演绎是指参数没有明确给出,而是从函数参数中推断出来。

2赞 ach 7/14/2023 #2

你的模板语法错误了。你的模板有一个非类型(整数)参数,你不需要介绍性关键字,例如(使用一个的可能性是 C 语法的余数),但你需要给它一个名称,例如,在模板正文中引用该参数。enums

template <Scalar s>
struct Zero
{
    typename DeduceNative<s>::type value() { return 0; }
};