提问人:jerin 提问时间:7/14/2023 更新时间:7/14/2023 访问量:49
无法从 C++ 模板类中的枚举推断类型
Failing to deduce type from enum in a C++ template class
问:
我有以下简化的示例,我尝试从我创建的枚举 () 映射到本机类型 ()。我正在尝试根据这个答案进行扩展。f32
float
#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_draft
example
working_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; }
答:
4赞
463035818_is_not_an_ai
7/14/2023
#1
你想要这个
template <Scalar sc>
struct Zero {
typename DeduceNative<sc>::type value() { return 0; }
};
Zero
具有非类型模板参数。 是一个,但它是未命名的。然后你尝试了,这毫无意义。 不是模板参数的名称,而是类型的名称。您还需要关键字,因为它是依赖名称。enum Scalar
DeduceNative<Scalar>
Scalar
enum
typename
PS:你的代码中没有推导任何内容。演绎是指参数没有明确给出,而是从函数参数中推断出来。
2赞
ach
7/14/2023
#2
你的模板语法错误了。你的模板有一个非类型(整数)参数,你不需要介绍性关键字,例如(使用一个的可能性是 C 语法的余数),但你需要给它一个名称,例如,在模板正文中引用该参数。enum
s
template <Scalar s>
struct Zero
{
typename DeduceNative<s>::type value() { return 0; }
};
评论