任何人都可以告诉我实现这一目标的最佳方法。
说,我有一个像
这样的模板功能template<typename ARGUMENT>
void get_result(ARGUMENT &ag)
{
// arg can be a single object of a particular object or list of objects of that particular class.
//rest
}
有没有办法可以检查&amp; ag是单个对象还是对象列表。此外,使用给定的模板界面。
如果答案是通过类接口以某种方式通过模板规范并不重要。唯一的问题是我不想指定对象类型或列表类型。
实施例。 ag = int或ag = list
CB
答案 0 :(得分:7)
template<typename ARGUMENT>
void get_result(ARGUMENT& ag);
template<typename ARGUMENT>
void get_result(std::list<ARGUMENT>& ag);
编辑:
阅读你的评论,我觉得你正试图过度设计你的职能并承担很多责任。
我认为你最好只用第一次过载。只要您需要将函数应用于整个范围,请使用for_each
。
答案 1 :(得分:2)
你可以消除一些类型特征的歧义:
#include <type_traits>
template<typename T>
T get_result(T arg)
{
return detail::get_result(arg, typename std::is_arithmetic<T>::type() );
}
namespace detail {
template<typename T>
T get_result(T arg, std::false_type /* dummy */) { }
template<typename T>
T get_result(T arg, std::true_type /* dummy */) {}
}
中有检测容器类型的想法
答案 2 :(得分:1)
你是说这个吗?
template<typename ARGUMENT>
void get_result(ARGUMENT &ag)
{
std::cout<<typeid(ARGUMENT).name(); //Check the value
/*This returns a name of the type in question.
It may satisfy your criteria.*/
}
//Header :#include <typeinfo>
所以,
int x=12;
list <int> l;
get_result<list<int>>(l); // Outputs: St4listIiSaIiEE
get_result<int>(x); //Outputs: i
答案 3 :(得分:1)
SFINAE:
template<typename T>
T get_result(T arg, typename T::value_type* = 0)
{
// Container.
}
template<typename T>
T get_result(T arg, ...)
{
// Not a container. Vararg overloads rank lower in overload resolution.
}