6

任何人都可以让我知道实现这一目标的最佳方法。

说,我有一个模板函数,比如

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

}

有没有一种方法可以检查 &ag 是单个对象还是对象列表。此外,使用给定的模板接口。

答案是否以某种方式通过类接口通过模板规范并不重要。唯一的事情是我不想指定对象类型或列表类型。

前任。ag = int 或 ag = 列表

CB

4

4 回答 4

7

嗯,也许你所需要的只是简单的重载?

template<typename ARGUMENT>
void get_result(ARGUMENT& ag);

template<typename ARGUMENT>
void get_result(std::list<ARGUMENT>& ag);

编辑:

阅读您的评论,我感觉您正试图过度设计您的功能并将其赋予许多责任。

我认为你最好只使用第一个超载。每当您需要将该函数应用于整个范围时,请使用for_each.

于 2013-07-29T09:16:16.340 回答
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 */) {}
}

这里
这个特征显然只是拉出数字类型,而不是容器。返回类型将需要一些工作。在此处此处的答案中有检测容器类型的想法

于 2013-07-29T10:21:22.190 回答
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
于 2013-07-29T09:21:35.363 回答
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.
}
于 2013-07-29T10:52:54.160 回答