次のような関数があるとします。
template <class In, class In2>
void func(In first, In last, In2 first2);
この関数で、述語を受け入れる別の関数を呼び出したいと思います。私の最初の本能は、次のようなことをすることでした:
template <class In, class In2>
void func(In first, In last, In2 first2) {
typedef typename std::iterator_traits<In>::value_type T;
other_func(first, last, first2, std::less<T>());
}
In
しかし、In2
イテレータが異なる型の場合はどうなるでしょうか? たとえば、char*
対int*
。In
どちらが述語でどちらが述語であるかに応じてIn2
、比較中に値が切り捨てられる場合があります。たとえば、 if In
is char*
thenは、 is でstd::less<char>
あっても呼び出されます。In2
int*
に::operator<
2 つのパラメーターを指定すると、コンパイラは正しい型を推測でき、標準の型昇格規則が適用されます。ただし、関数に渡す述語を選択する場合、これが発生する機会はありません。とに基づいて、どのバージョンを渡したいかを判断する賢い方法はありますか?std::less<>
In
In2
編集:
次の例は、この問題を示しています。
unsigned int x = 0x80000000;
unsigned char y = 1;
std::cout << std::less<unsigned char>()(x, y) << std::endl;
std::cout << std::less<unsigned int>()(x, y) << std::endl;
出力します:
1
0
編集:
それについて考えた後、私が本当に欲しいのは、次のようなことができるようになることです:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
gcc の__typeof__
拡張機能を使用できると思いますが、そのアイデアも好きではありません。標準に準拠した方法でその正味の効果を得る方法はありますか?