【问题标题】:Getting Return Type of Callable Type in VS2010在VS2010中获取可调用类型的返回类型
【发布时间】:2014-08-06 21:08:06
【问题描述】:

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

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

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

【问题讨论】:

  • decltype() 呢?
  • 哦,没关系,我明白你在问什么——你需要获取通用 lambda 的返回类型,对吗?
  • @Jashaszun:是的,没错。
  • 你知道Callable应该被调用的参数类型吗?
  • @Brian:是的。一个已知类型的 arg。

标签: c++ visual-studio-2010


【解决方案1】:

std::result_of

假装对象是用一个int 参数调用的,你可以这样做:

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

【讨论】:

  • 我尝试使用std::result_of,但这种特殊用法似乎不适用于 VS2010。即使使用常规的typedef 而不是using
【解决方案2】:

这通常是不可能的。

有多种方法可以获得可调用类型,包括 lambda 和重载 operator()structs。

C++ 几乎没有像 C# 这样的语言所具备的反射类型,而且使用 C++ 提供的工具也不可能做到这一点。

如果您只想将该“可调用”的结果存储到一个变量中,那么您可以使用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.

【讨论】:

  • 没错。因此我的问题。 auto 在这里无济于事,因为我需要有条件地使用结果,而不是存储它。
  • 查看我的编辑。我测试了它和所有的,它的工作原理! :)
  • 请不要基于编译时类型if
  • 当结果类型为void 时这会起作用吗?这是一种常见的情况。
  • @AdiShavit 不会,因为void 不是类型。我认为任何解决方案都不能与void 一起正常工作。
【解决方案3】:

我尝试了各种方法,但在 VS2010 中对 C++11 的支持只是部分的,而且大多数方法根本无法编译。

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

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

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

请注意,这不是通用解决方案(尽管在我的情况下已经足够),因为:

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

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2016-07-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多