gpt4 book ai didi

c++ - 我可以声明一个模板只接受具有同质签名的函数吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:29 27 4
gpt4 key购买 nike

我有一组双函数,每个函数取 N T 类型的参数,带有一个类型为 X 的附加参数对于第二个。

对于 N=2 , T=intX=std::vector<int>双重将是这样的:

void my_function2(int x1, int x2) {}
void my_function2(int x1, int x2, std::vector<int> other) {}

我正在尝试编写一个模板化的高阶函数,我将第一个函数传递给该函数。

这将适用于 N=2 :

template <typename R, typename T>
int my_hof(R(*param)(T, T)) { param(1,2); }

my_hof(&my_function2); // compiles

制作 param 的签名explicit 很重要,否则模板实例化会因为“未解析的重载函数类型”而失败。重点是消除 my_function2() 的第二次过载.

我的问题是我想不出一种方法将其概括为 N .我尝试使用可变参数模板:

template <typename R, typename ...X> 
struct make_signature { using type = R(*)(int, int); };
// Cheating a big on make_signature not to clutter the question
// But the idea would be to repeat the same type N times.

template <typename R, typename ...X>
int my_generalized_hof(typename make_signature<R, X...>::type param) {
f(1,2); // cheating a bit on the call too
}

my_generalized_hof(&my_function2); // does not compile

我猜编译器对 param 的类型感到困惑没有直接给出,它无法决定使用哪个重载来进行类型计算。 (“再次 Unresolved 重载函数类型”)。我认为它也会拒绝进行类型计算,因为它无法推断出 R 的类型。 .

我想不出生成签名的方法。

可以用C++写吗?

(请注意,我知道我可以通过在调用 my_function2() 时将 my_generalized_hof() 转换为正确的类型来选择重载,但我想避免这种情况)

最佳答案

我提出以下建议 make_signature

template <typename T, std::size_t>
using getType = T;

template <typename, typename, std::size_t N,
typename = std::make_index_sequence<N>>
struct make_signature;

template <typename R, typename T, std::size_t N, std::size_t ... Is>
struct make_signature<R, T, N, std::index_sequence<Is...>>
{ using type = R(*)(getType<T, Is>...); };

但是有个问题:当你写的时候

template <typename R, typename T, std::size_t N>
void my_generalized_hof (typename make_signature<R, T, N>::type param)
{
// do something with param
}

make<R, T, N>部分在无推导上下文中(在 :: 之前),所以 R , T , 和 N不能从论证中推导出来。

我是说……你不能打电话

 my_generalized_hof(&my_function2); 

你必须如下显式显示模板参数

 // ...............VVVVVVVVVVVVVVV
my_generalized_hof<void, int, 2u>(&my_function2);

下面是一个完整的编译示例

#include <utility>
#include <vector>
#include <type_traits>

void my_function2(int x1, int x2) {}
void my_function2(int x1, int x2, std::vector<int> other) {}

template <typename T, std::size_t>
using getType = T;

template <typename, typename, std::size_t N,
typename = std::make_index_sequence<N>>
struct make_signature;

template <typename R, typename T, std::size_t N, std::size_t ... Is>
struct make_signature<R, T, N, std::index_sequence<Is...>>
{ using type = R(*)(getType<T, Is>...); };

template <typename R, typename T, std::size_t N>
void my_generalized_hof (typename make_signature<R, T, N>::type param)
{
// do something with param
}

int main ()
{
my_generalized_hof<void, int, 2u>(&my_function2);
}

关于c++ - 我可以声明一个模板只接受具有同质签名的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com