c++解析函数类型模板参数

C++ parsing function-type template argument

本文关键字:参数 类型 函数 c++      更新时间:2023-10-16

我希望能够调用函数与模板参数是函数类型(包括参数和返回类型),即double(int, long),并在函数中分离的类型,并单独使用它们。

例如,我希望能够调用函数

printRes<double(int, long)>();

上面的函数应该解析模板参数并提取返回类型double并输出它。

我知道如何使用类和可变模板来做到这一点:

#include <iostream>
#include <typeinfo>
template <typename T>
class A {};
template <typename Res, typename... Args>
class A<Res (Args...)> { // Parse template argument
public:
    void printRes() {
        std::cout << typeid(Res).name() << std::endl;
    }
};

那么我可以这样使用:

int main() {
    A<double(int, long)> a;
    a.printRes();
}
输出:

d

我想用一个简单的函数来代替。这是我想出来的:

template <typename Res, typename... Args>
void printRes() {
    std::cout << typeid(Res).name() << std::endl;
}
但是,现在我必须像这样指定模板参数:
int main() {
    printRes<double, int, long>();
}

是否有任何方法来实现函数,所以它可以使用相同的模板参数作为类版本(即double(int, long))调用?

我想你快到了。你可以在函数模板中使用trait。下面是一个可能的实现:

#include <iostream>
#include <typeinfo>
template <typename T>
struct A { };
template<typename Res, typename... Args>
struct A<Res (Args...)> 
{
    using type = Res;
};
template<typename T>
void printRes() 
{
    using Res = typename A<T>::type;
    std::cout << typeid(Res).name() << std::endl;
}
int main()
{
    printRes<double(int, long)>();
}

下面是一个实例