我有一个带有可调用类型参数<typename Callable>
的模板类。
我知道Callable
确实创建了一个可调用的对象,并且通常是一个lambda
在我的特定情况下,我也知道参数的数量(arity)和类型(只有一个)。
如何在VS2010上获取此可调用类型Callable
的返回类型?
答案 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。
请注意,这不是一般解决方案(虽然在我的情况下足够),因为: