Deduce函数对象参数类型

时间:2015-03-14 03:58:49

标签: c++ templates type-deduction

给定一组参数类型和一个函数对象,可以使用decltype推导出返回类型。推断参数类型怎么样?

对于函数指针,可以使用有趣的模式匹配语法推导返回和参数类型。举个例子,这是一个愚蠢的程序,它使用推导出的参数类型来打印出一个描述函数指针的返回和参数类型的字符串。

#include <iostream>
#include <string>

using std::string;

template<class T>
string type_str();

template<>
string type_str<int>() { return "int"; }

template<>
string type_str<char>() { return "char"; }

string arg_types_str()
{
    return "";
}

template<class T>
string arg_types_str()
{
    return type_str<T>();
}

template<class T, class U, class... Args>
string arg_types_str()
{
    return type_str<T>() + ", " + arg_types_str<U, Args...>();
}

template<class R, class... Args>
void print_fptr_type(R (*fptr)(Args...))
{
    std::cout << type_str<R>() << " (*)(" << arg_types_str<Args...>() << ")" << std::endl;
}

int main()
{
    int (*fptr)(char, int);
    print_fptr_type(fptr);
}

输出:

int (*)(char, int)

Live demo.

是否可以编写一个类似于示例的程序来代替打印函数对象的返回和参数类型?

对于只有一个operator()的函数对象,原则上可以明确推断出参数类型。

1 个答案:

答案 0 :(得分:0)

是的,可以做到。策略类似,但有一个功能对象,它是一个两阶段的过程。首先,获取到operator()的成员函数指针,然后可以使用类型推导的类似模式匹配方法。

Live demo.

新计划的关键部分是:

template<class T, class R, class... Args>
void print_memfptr_types(R (T::*memfptr)(Args...))
{
    std::cout << type_str<R>() << " (" << type_str<T>() << "*)(" << arg_types_str<Args...>() << ")" << std::endl;
}

template<class T, class R, class... Args>
void print_cmemfptr_types(R (T::*memfptr)(Args...))
{
    std::cout << type_str<R>() << " (const " << type_str<T>() << "*)(" << arg_types_str<Args...>() << ")" << std::endl;
}

template<class T>
void print_fnc_obj_types(T&)
{
    print_memfptr_types(&T::operator());
}

template<class T>
void print_fnc_obj_types(const T&)
{
    print_cmemfptr_types(&T::operator());
}