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

2023-12-24

我希望能够致电function具有函数类型(包括参数和返回类型)的模板参数,即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))?


我想你已经快到了。您可以在函数模板中使用您的特征。这是一个可能的实现:

#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)>();
}

这是一个活生生的例子 http://liveworkspace.org/code/4sAas7%2453.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 解析函数类型模板参数 的相关文章

随机推荐