这可能是一个愚蠢的问题,但我想澄清一点。假设我有一个类似的模板函数:
template<class T> T getValue(const char *key) const;
从内部存储返回T
的值,它存储在key
下(可能已经是T类型)。
现在为了使用它,我需要在函数调用中指定模板返回类型T
,例如:
int value = getValue<int>("myKey");
虽然我希望它做的是从上下文中推导出模板参数,特别是lvalue
,如下所示:
int value = getValue("myKey"); //getValue<int>() is instantiated with int being deduced automatically from lvalue
但我猜这不可能,但我为什么这么模糊。我知道使用auto
会使编译器无法推断出模板类型,但为什么会这样呢?
答案 0 :(得分:3)
模板实例化只能从给定模板化对象的参数中推导出它的参数(在这种情况下是函数)所以不,变量类型在推导中无关紧要,你要么必须为函数提供类型为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