C++ 如何定义具有两个相对参数的模板函数

C++ 如何定义具有两个相对参数的模板函数,c++,templates,functor,C++,Templates,Functor,我试图定义一个函数,它允许我们调用标准哈希函数或一些自定义函数,并返回哈希值 下面是一个关于如何使用my函数的示例: 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

我试图定义一个函数,它允许我们调用标准哈希函数或一些自定义函数,并返回哈希值

下面是一个关于如何使用my函数的示例:

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
肯定是错误的,因为
U
没有定义。但是我不知道如何修复它。

您需要声明这两个参数。此外,
std::hash
是一个类模板,而不是一个函数。可以使用模板参数:

#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"});
}
#包括
#包括
#包括
#包括
样板
std::size\u t myfunc(常数t&t)
{
返回H{}(t);
}
int main(){

std::cout您需要声明这两个参数。此外,
std::hash
是类模板,而不是函数。您可以使用模板参数:

#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"});
}
#包括
#包括
#包括
#包括
样板
std::size\u t myfunc(常数t&t)
{
返回H{}(t);
}
int main(){


std::cout
std::hash
不是函数。修复函数指针的尝试(假设可能)仍然不会让您走得更远。@StoryTeller UnslanderMonica好的,我在帖子中添加了一行:“t应该是函数指针、std::函数或lambda,U是t的参数类型。”.customhasher是否为模板?
返回T(u)
建议
T
是一个模板,这是必需的还是您可以通过例如
std::hash
?@maxist\u prime\u是_463035818是的,customhasher就像
std::hash
,这是一个带有一个参数的模板。@maxist\u prime\u是_463035818,这就是重点。你看,我不想通过
std::hash
,我只是想t简单地传递一个
std::hash
std::hash
不是一个函数。修复函数指针的尝试(假设可能)仍然不会让你走得更远。@StoryTeller UnslanderMonica好的,我在我的帖子中添加了一行:“t应该是函数指针,std::function或lambda,U是t的参数类型。”.customhasher是否为模板?
返回T(u)
建议
T
是一个模板,这是必需的还是您可以通过例如
std::hash
?@maxist\u prime\u是_463035818是的,customhasher就像
std::hash
,这是一个带有一个参数的模板。@maxist\u prime\u是_463035818,这就是重点。你看,我不想通过
std::hash
,我只是想t简单地传递一个
std::hash
。酷,不知道这个。C++17有这个吗?@kabaus C++98有这个;)@Yves没有,因为“abc”是一个c字符串文本,没有std::hash专门化。@Yves我不是模板向导,但您可以使用重载或专门化,例如..Edit:忘记函数模板不允许部分模板专门化。重载似乎有效。@Yves注意,从c字符串到std::string的转换不是免费的。您可以可以研究使用支持多种字符串格式(但不属于所有)的酷,不知道。C++17有这个吗?@kabaus C++98有这个;)@Yves没有,因为“abc”是一个c字符串文本,没有std::hash专门化。@Yves我不是模板向导,但您可以使用重载或专门化,例如..Edit:忘记函数模板不允许部分模板专门化。重载似乎有效。@Yves注意,从c字符串到std::string的转换不是免费的。您可以可以考虑使用支持多种字符串格式(但不属于所有)的
#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"});
}