我定义了下面的函数模板,但是我遇到了一些问题。请帮帮我。谢谢!
template <typename T>
void Insert(CMyObj obj_, std::vector<T>& vec_)
{
if(T is bool type)
vec_.push_back(obj_.AsBool());
if(T is string type)
vec_.push_back(obj_.AsString());
}
我可以如下调用函数模板,我应该如何实现我的 Insert()。
CMyObj obj;
std::vector<bool> vec1;
Insert<bool>(obj, vec1);
std::vector<string> vec2;
Insert<string>(obj, vec2);
最佳答案
首先,如果模板参数可以从参数中推导出来(在本例中可以),您可以简单地通过“Insert(obj, vec1)”调用它:如果 vec1 是 std::vector<code><bool</code>>
, T 将是 bool 等...
其次,我将定义第二个函数模板,专门用于从类似变体的 CMyObj 中提取类型化值:
template <typename T>
T GetValue(const CMyObj& obj); // Note: no definition
// These should be inline or in a .cpp file to prevent linker issues
template <>
inline bool GetValue(const CMyObj& obj) { return CMyObj.AsBool(); }
template <>
inline std::string GetValue(const CMyObj& obj) { return CMyObj.AsString(); }
然后您可以将 Insert 实现为:
template <typename T>
void Insert(CMyObj obj_, std::vector<T>& vec_)
{
vec_.push_back(GetValue<T>(obj_));
}
如果您尝试将其插入到具有 GetValue 尚未特化的值类型的 vector 中,它将无法编译。我猜这就是您想要的。
关于c++ - 如何在函数模板中获得不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22552080/