Во время написания запроса вы можете следовать нескольким вещам:
1. Analyze your data.
2. Make sure you have created necessary indexes.
3. In Select statement write only required column, avoid unnecessary columns.
4. Do not write subquery or co-related query until and unless is required.
Давайте посмотрим, могут ли помочь следующие шаги. Но Inner Join - это базовое соединение, которое нельзя заменить, если вам нужно объединить две таблицы.
Вам необходимо специализировать std :: less с типом сравнения, который вы используете.
Pair1stFunc2<MyPair, std::less<int> >()
поможет вам. В вашем собственном операторе () вам также нужно создать экземпляр объекта типа сравнения, поскольку вы не можете просто вызвать класс напрямую. Например, измените
return F(lhs.first, rhs.first);
на
F func;
return func(lhs.first, rhs.first);
. Вы также можете переместить специализацию в функтор, как предлагает другой ответ.
Чтобы раскрыть ответ Диркгентли, вот пример того, что может сработать так, как вы намеревались:
template <typename T, template <typename> class F>
struct Pair1stFunc2
{
template <typename P>
typename F<T>::result_type operator()(P &lhs, P &rhs) const
{ F<T> f; return f(lhs.first, rhs.first); }
template <typename P>
typename F<T>::result_type operator()(const P &lhs, const P &rhs) const
{ F<T> f; return f(lhs.first, rhs.first); }
};
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<int, std::less>());
}
Обратите внимание, что это работает, но это может быть не совсем то, что вы имели в виду.
Аналогично unwesen. Но вам не нужно использовать шаблоны шаблонов.
#include <algorithm>
#include <functional>
#include <memory>
#include <vector>
typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;
// Same as original.
template <typename T,typename F>
struct Pair1stFunc2
{
template <typename P>
typename F::result_type operator()(P &lhs, P &rhs) const
{ F f; // Just need to create an anstance of the functor to use.
return f(lhs.first, rhs.first); }
template <typename P>
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ F f; // Just need to create an anstance of the functor to use.
return f(lhs.first, rhs.first); }
};
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<int, std::less<int> >()); // initialize the version of less
}
Обратите внимание, что std :: less
сам по себе является шаблоном, и вы не указываете параметр шаблона шаблона, когда вызываете его из foo ()
сортировка функции
! Здесь меньше
является неполным типом и, следовательно, проблема.
Простейшим решением было бы указать, что вы хотите в качестве аргумента, функцию с подходящей сигнатурой:
template<typename P, bool (*F)(P,P)> struct Pair1stFunc2 { ... }
В этом случае передача шаблона функции в качестве второго аргумента вызовет разрешение перегрузки. должно быть сделано с P, P в качестве типов аргументов. Это работает, потому что вы перемещаете разрешение перегрузки из struct Pair1stFunc2 :: operator ()
Вы также хотите иметь возможность передать функтор , но они должны быть переданы как шаблон Аргумент type, а затем созданный внутри operator ():
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F()(lhs.first, rhs.first); }
Здесь F - это тип функтора, а F () - экземпляр этого функтора.
Третий случай уже описан ранее, шаблон функтора. std :: less - это такой шаблон. В этом случае вам понадобится аргумент шаблона шаблона.