2016-09-27 2 views
0

Привет, Я пытаюсь написать обобщенную функцию сравнения isLess для int, double, null terminated character array и т. Д. Ниже мой код такой же, пожалуйста, помогите я понимаю, как мы можем использовать эту функцию для строк с нулевым завершением.C++ Как написать обобщенную функцию компаратора для int, double, string и т. Д. С помощью шаблонов

#include<iostream> 

using namespace std; 

template<typename T> 
bool isLess(T &x, T &y) 
{ 
    return x < y; 
} 

int main() 
{ 
    int a(10), b(20); 
    double c(2.0), d(3.0); 
    cout<<isLess<int>(a,b)<<endl; 
    cout<<isLess<double>(c,d)<<endl; 
    //For above types, generic comparator works fine 

    //but if we have to compare character represented string, how can we do this in our comparator 
    //assume charaters strings are compared the same way as strcmp. 


    //char *e = "str1"; 
    //char *f = "str2"; 
    //cout<<isLess<char*>(e,f)<<endl; 

    return 0; 
} 
+3

Использование специализации шаблона для 'сопзЬ полукокса *' на основе 'STRCMP)' функции (? –

+0

Что означает, что строка должна быть «меньше» другой строки? Как вы можете обобщить это на произвольные типы? Вам нужны специальные указания. –

+1

Добавьте некоторую константную корректность к вашему коду. –

ответ

1

Вы можете использовать компараторы из стандартной библиотеки (то есть std::less).

Это говорит, почему бы не использовать общие лямбды, если вы хотите определить их для себя?

auto isLess = [](auto &x, auto &y) { 
    return x<y; 
}; 

auto isLessStr = [](auto *x, auto *y) { 
    // ... Use whatever you want here 
}; 

Используйте их тогда, как isLess(a,b) и isLessChar(e, f).

0

std::less в значительной степени стандарт для этого.

Если вы хотите, вы можете перевернуть свою собственную функцию, которая делает то же самое, за исключением char*. Решение было бы добавить селектор, который либо использовать свой собственный компаратор, и возврат к стандарту, если вы не укажете для конкретного типа:

struct my_string_compare { 
    bool operator()(const char* a, const char* b) const { 
     // do whatever you want here. 
    } 
}; 

template<typename T> 
struct select_less { 
    using type = std::less<T>; 
}; 

template<> 
struct select_less<char*> { 
    using type = my_string_compare; 
}; 

template<typename T> 
using my_less = typename select_less<T>::type; 

Затем, вы можете использовать функцию так:

my_less<char*> char_less; 

if (char_less("string1", "string2")) { 
    // ... 
} 

my_less<int> int_less; 

// Same as std::less<int> 
if (int_less(7, 9)) { 
    // ... 
} 

Что хорошего в том, что если вам нужно больше перегрузок, вы просто добавляете еще одну специализацию.

Другим преимуществом является то, что вы не отменяете какое-либо стандартное поведение. Вы либо используете свою собственную структуру, либо стандарт.

Для объяснения того, что using делает, см typedef и Using-declaration

+0

Если вы нашли ответ полезным, не делайте забыть, чтобы его продвинуть. –

+0

tnx для вашего ответа. Не могли бы вы рассказать мне сейчас, что используя ключевое слово в коде struct select_less { using type = std :: less ; }; Я довольно новичок в C++. Я видел использование для использования пространства имен std; , но не способен понять семантику использования здесь. Тпх :) – kapil

+0

может быть ссылка может быть полезно :) – kapil

Смежные вопросы