gpt4 book ai didi

C++ 模板参数推断

转载 作者:可可西里 更新时间:2023-11-01 18:35:29 24 4
gpt4 key购买 nike

作为练习,我尝试使用模板编写数组实现,但使用函数指针作为模板参数。每次数组被索引时都会调用此函数。

template<typename T, int size>
using Array_fnIndex = void (*)(int index);

template<typename T, int size, typename Array_fnIndex<T, size> fnIndex>
struct Array {
T data[size];
T& operator[](int index) {
fnIndex(index);
return data[index];
}
};

// example index function
template<typename T, int size>
void checkIndex(int index) {
assert(index < size);
}

int main() {
Array<int, 10, checkIndex<int, 10>> a; // this works
Array<int, 10, checkIndex<int, 11>> b; // this also works, not what I want
Array<int, 10, checkIndex> c; // this doesn't work, but what I want
return 0;
}

main 函数中的最后一个 Array 声明是我想要的,其中 checkIndex 的模板参数与 Array 中的先前模板参数匹配。但是,这不会编译(使用 Microsoft 编译器)。我收到以下错误:

error C2440: 'specialization': cannot convert from 'void (__cdecl *)(uint)' to 'void (__cdecl *)(uint)'
note: None of the functions with this name in scope match the target type

有什么方法可以从其他参数推断出所提供函数的模板参数,从而获得所需的结果?

最佳答案

可能不适用于您的实际用例,但我建议使用一个包含执行检查的函数的可调用对象:

template<typename T, int size, typename fnIndex>
struct Array {
T data[size];
T& operator[](int index) {
fnIndex{}.template check<size>(index);
return data[index];
}
};

struct checkIndex {
template<int size>
void check(int index) {
assert(index < size);
}
};

int main() {
Array<int, 10, checkIndex> c;
return 0;
}

wandbox example


让我们分析一下fnIndex{}.template check<size>(index) :

fnIndex{} // make a temporary object of type `fnIndex`
.template check<size>(index) // call its `check` method using `size`
// as a template argument and `index` as
// as a function argument

.template需要消除歧义语法,因为编译器不知道什么 check意味着 - 它可以是一个字段,该行可以解释为:

fnIndex{}.check < size > (index)

哪里<小于运算符>大于运算符(index)是一个表达式。

使用 .template告诉编译器我们要调用模板方法。

关于C++ 模板参数推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41548216/

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