gpt4 book ai didi

c++ - 从左值中推导模板返回类型?

转载 作者:太空狗 更新时间:2023-10-29 21:17:34 24 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我仍然希望澄清一下。假设我有一个像这样的模板函数:

template<class T> T getValue(const char *key) const;

从存储在 key 下的内部存储中以 T 的形式返回值(并且可能已经作为类型 T)。

现在为了使用它,我需要在函数调用中指定模板返回类型 T,例如:

int value = getValue<int>("myKey");

虽然我希望它做的是从上下文中推导出模板参数,特别是 lvalue,如下所示:

int value = getValue("myKey"); //getValue<int>() is instantiated with int being deduced automatically from lvalue

但我猜这是不可能的,但我不太清楚为什么。我知道使用 auto 会使编译器无法推断模板类型,但为什么会这样呢?

最佳答案

模板实例化只能从给定模板对象(在本例中为函数)的参数中推导出其参数,所以不,变量类型在推导中无关紧要,您要么必须向函数提供类型 T 的虚拟参数,要么就像在倒数第二个脚本代码 ( getValue<int>(...) ) 中所做的那样对其进行硬编码。

有一个可能的解决方法是使用评论中提出的类型推导:

#include <iostream>

namespace byte_read {
//this is a hack to deduce the type using implicit conversion
struct type_converter {
const char* buffer;

template<typename T>
operator T() {
std::cout << "implicit convertion from " << typeid(buffer).name()
<< " to " << typeid(T).name() << std::endl;
//casting memory to the desired type
return static_cast<T>(*buffer);
}
};
type_converter getValue(const char * buffer) {
//here buffer is implicitly converted to T type using the operator T()
return {buffer};
}

}
using namespace byte_read;

int main()
{
char buffer[]{0,1,0,0 //int 256 encoded
,97 //char 'a' encoded
};
//pointer to read the buffer sequentialy
char* pos = buffer;
//pointer used to count the bytes readed
char* last_pos = pos;

int int_256 = getValue(pos);
pos+=sizeof(int);
std::cout << int_256 << " bytes readed :" << pos - last_pos << std::endl;

last_pos = pos;
char char_a = getValue(pos);
pos+=sizeof(char);
std::cout << char_a << " bytes readed :" << pos - last_pos << std::endl;

}

可以试试here

关于c++ - 从左值中推导模板返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554442/

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