如何定义具有两个相关参数的模板函数
How to define a template function with two relative parameters
我正在尝试定义一个函数,它允许我们调用标准散列函数或一些自定义函数,以及 return 散列值。
这是一个关于如何使用我的函数的例子:
auto res = myfunc<std::hash>(2); //hash the integer 2 with the function std::hash
auto res2 = myfunc<std::hash>("abc"); // hash the string "abc" with the function std::hash
auto res3 = myfunc<customHasher>(2); // hash the integer 2 with some custom hash function
我试过如下编码:
template<void (*T)(U)>
size_t myfunc(const U &u)
{
return T<U>(u);
}
T
应该是函数指针,std::function
或者lambda,U
是T
.
的参数类型
但是无法编译
main.cpp:14:23: error: expected ‘>’ before ‘(’ token
template<void (*T)(U)>
^
main.cpp:15:25: error: ‘U’ does not name a type
size_t myfunc(const U &u)
^
main.cpp: In function ‘size_t myfunc(const int&)’:
main.cpp:17:18: error: ‘U’ was not declared in this scope
return T<U>(u);
嗯,我知道template<void (*T)(U)>
一定是错的,因为U
没有定义。但是我不知道怎么解决。
您需要声明两个参数。此外,std::hash
是一个 class 模板,而不是函数。您可以使用模板模板参数:
#include <cstdint>
#include <functional>
#include <iostream>
#include <string>
template<typename T, template<typename> typename H = std::hash>
std::size_t myfunc(const T &t)
{
return H<T>{}(t);
}
int main() {
std::cout << myfunc(std::string{"123"});
}
不过,要与您的 customHasher
一起使用,它也需要是一个 class 模板(使用 operator()
)。
注意需要在main
中显式构造字符串,否则T
不能推导为std::string
.
我正在尝试定义一个函数,它允许我们调用标准散列函数或一些自定义函数,以及 return 散列值。
这是一个关于如何使用我的函数的例子:
auto res = myfunc<std::hash>(2); //hash the integer 2 with the function std::hash
auto res2 = myfunc<std::hash>("abc"); // hash the string "abc" with the function std::hash
auto res3 = myfunc<customHasher>(2); // hash the integer 2 with some custom hash function
我试过如下编码:
template<void (*T)(U)>
size_t myfunc(const U &u)
{
return T<U>(u);
}
T
应该是函数指针,std::function
或者lambda,U
是T
.
但是无法编译
main.cpp:14:23: error: expected ‘>’ before ‘(’ token
template<void (*T)(U)>
^
main.cpp:15:25: error: ‘U’ does not name a type
size_t myfunc(const U &u)
^
main.cpp: In function ‘size_t myfunc(const int&)’:
main.cpp:17:18: error: ‘U’ was not declared in this scope
return T<U>(u);
嗯,我知道template<void (*T)(U)>
一定是错的,因为U
没有定义。但是我不知道怎么解决。
您需要声明两个参数。此外,std::hash
是一个 class 模板,而不是函数。您可以使用模板模板参数:
#include <cstdint>
#include <functional>
#include <iostream>
#include <string>
template<typename T, template<typename> typename H = std::hash>
std::size_t myfunc(const T &t)
{
return H<T>{}(t);
}
int main() {
std::cout << myfunc(std::string{"123"});
}
不过,要与您的 customHasher
一起使用,它也需要是一个 class 模板(使用 operator()
)。
注意需要在main
中显式构造字符串,否则T
不能推导为std::string
.