有没有办法在函数模板参数推导中强制隐式转换?

问题描述

我有这个 count_ 函数模板,用于计算该类型向量中某个值的出现次数:

template <typename T>
std::size_t count_(std::vector<T> const& vt,T const& value)
{
    std::cout << "count_(vector<T>,T const&)\n";
    std::size_t n{};
    for(auto const& e : vt)
        if(e == value)
            ++n;
    return n;
}

template <>
std::size_t count_(std::vector<char const*> const& vcp,char const * const& value)
{
    std::cout << "count_(vector<char const*>,char const*const&)\n";

    std::size_t n{};
    for(auto const& e : vcp)
        if( !strcmp(e,value))
            ++n;
    return n;
}



int main()
{

    std::vector<std::string> vs{"function","C++","template","specialization","partial","full"};
    std::cout << count_(vs,std::string("C++")) << '\n';

    std::vector<double> vd{3.14,5.2,7.7,3.14,56.87,6.8798,12.545};
    std::cout << count_(vd,3.14) << '\n';

    std::cout << count_(std::vector{7,24,16,7,81,5,23,10,15,8},7) << '\n';

    std::vector<char const*> vcp{"function","full"};
    std::cout << count_(vcp,static_cast<char const*>("C++")) << '\n';


    std::cout << "\ndone!\n";
}
  • 该程序运行良好,但是我总是需要将第二个参数显式转换或传递给作为第一个参数传递的 vector 的元素类型的类型。

  • 我知道这是由于模板参数推论中的数量有限或允许隐式转换而发生的。如果 count_ 是一个普通的非模板函数,那么它可以正常工作,无需将文字字符串转换为指向 char 的常量指针。

那么有没有更好的方法来避免这种类型转换 std::string("C++"),static_cast<char const*>("C++")...?

我想有像“元编程”这样的东西,如果有的话,你能详细说明一个例子吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)