【发布时间】:2020-06-19 08:39:12
【问题描述】:
我是 C++ 模板的新手,我想编写一个模板函数,该函数根据其参数返回单个对象或对象向量。
我有一个包含键/值对的配置类。假设我有键“parent.child.1”,它应该返回一个 id=1 的对象。如果我有键“parent.child”,那么它应该返回子项下的所有对象。 child 下的所有对象都是同一类型,但不同的 child 可能持有不同的对象。
在我看来,生成的代码如下所示:
getParameter<MyObject>(key, value); //value is a referance, if key found copy it into value
getParameter<std::vector<MyObject>>(key, vectorValue); //value is a referance to the vector
我可以通过专门为每种类型的 getParameter 函数乘以 2 来做到这一点,但我认为如果我确实使用模板,我可以为每种不同类型减少大量样板代码。
我已经关注this other SO question,并在我的代码中使用它(我使用的是 c++11,所以它有点不同):
template<typename T>
void getParameter(const string& key, typename enable_if< !is_vector<T>::value,T>::type& val) {...} //Works fine when calling getParameter<MyObject>(key, value);
template<template<typename...>> class C, typename U>
void getParameter(const string& key, typename enable_if< is_vector<C<U>>::value, C<U>>::type& val) {...}//Fails in compile
当我调用getParameter<std::vector<MyObject>>(key, vectorValue); 时,它无法替换这两个函数。这是为什么呢?
【问题讨论】:
标签: c++ templates config metaprogramming sfinae