在VS2010中获取可调用类型的返回类型

时间:2014-08-06 21:08:07

标签: c++ visual-studio-2010

我有一个带有可调用类型参数<typename Callable>的模板类。

我知道Callable确实创建了一个可调用的对象,并且通常是一个lambda 在我的特定情况下,我也知道参数的数量(arity)和类型(只有一个)。

如何在VS2010上获取此可调用类型Callable的返回类型?

3 个答案:

答案 0 :(得分:2)

请参阅std::result_of

假装使用一个int参数调用对象,您可以执行以下操作:

using return_type = typename std::result_of<Callable(int)>::type;

答案 1 :(得分:1)

这通常是不可能的。

有多种方法可以使用可调用类型,包括重载struct的lambdas和operator()

C ++几乎没有像C#这样的语言那样的反射类型,并且不可能用C ++提供的工具。

如果您想要的只是存储&#34;可调用的结果&#34;变成一个变量,然后你就可以使用auto

如果您确实想根据其类型对结果进行处理,那么this question可能有所帮助。

基本上,将其添加到您的代码中。

template <typename T, typename U>
struct same_type 
{
   static const bool value = false;
};
template <typename T>
struct same_type< T, T >
{
   static const bool value = true;
};

然后,如果您有auto result = func(param);,其中func的类型为Callable,则可以使用以下内容检查result的类型:

if (same_type<decltype(result), int>().value)
{
    // code, knowing that result is of type int
}
else if (same_type<decltype(result), const char*>().value)
{
    // code, knowing that result is of type const char*
}
// else if ... etc.

答案 2 :(得分:0)

我尝试了各种方法,但在VS2010中对C ++ 11的支持只是部分的,大多数方法都没有编译。

最终的工作(在VS2010上)如下:

// When arity is known
typedef decltype(callbackInstance0())            return_type0; 
typedef decltype(callbackInstance1(argInstance)) return_type1;

其中callbackInstanceX是要使用的实际可调用对象,argInstance是要传递给callbackInstance的实际arg。

请注意,这不是一般解决方案(虽然在我的情况下足够),因为:

  • 它不能在没有这些类型的实际实例的函数之外使用,而只能在类定义中使用类型;
  • 必须知道可赎回的角色。