在c++中正确地模板化字符串比较器

templating a string comparator correctly in c++

本文关键字:字符串 比较器 c++ 正确地      更新时间:2023-10-16

我在c++中为字符串编写了一个比较器

    template <class T> class AStringComparator   // primary template declaration
    {
        public:
            bool operator()( T, T );
    };

    template <> class AStringComparator<std::basic_string<char> >
    {
        public:
        bool operator()( std::basic_string<char> _A, std::basic_string<char> _B )
        {
                //all the code here
            }
    }

然后,我尝试将其模板化为const char*,如下所示:

template <> class AStringComparator<char const *>
{
    public:
        bool operator()( char const * _A, char const * _B )
        {
            AStringComparator<std::basic_string<char> > S;
            std::basic_string<char> a(_A);
            std::basic_string<char> b(_B);
            S( a, b );
        }
};

这编译并运行,但几乎总是产生错误的结果。我想我在实现const char*版本时犯了一个错误。你能指出它吗。我的意图是将const char*的转换为basic_string,然后让我编写的并且正常工作的basic_string的原始函数来完成这项工作。但是出了严重的问题。

您的专业化缺少一个返回语句:

bool operator()( char const * _A, char const * _B )
{
    AStringComparator<std::basic_string<char> > S;
    std::basic_string<char> a(_A);
    std::basic_string<char> b(_B);
    S( a, b );  // <----------------- should be return S(a,b);
}

这是未定义的行为。在实践中,它会导致呼叫站点出现随机的真/假,这就是为什么它似乎"几乎总是错误的"。