2013-02-26

新しいconceptの案が議論されていたらしい。

C++1y 軽量Concept - Faith and Brave - C++で遊ぼう

Concepts Lite: Constraining Templates with Predicates—Andrew Sutton, Bjarne Stroustrup : Standard C++

PDF注意:Concepts Lite: Constraining Templates with Predicates

とりあえず型への制約のみを考えた軽量concept。

requireキーワードに続けて、bool型を返すconstexpr関数を指定することにより、型制約を記述できる。従来のSFINAEを用いたトリックよりわかりやすい。従来の方法は、メタプログラミングという概念をしっかりと理解し、C++上でメタプログラミングを行うためのトリックをいくつも知っていなければ書けないが、これなら初心者でも簡単に書ける。

template < typename T >
require Equality_comparable<T>( )
bool equality_compare( T const & t1, T const & t2 )
{
    return t1 == t2 ;
}

template < typename T >
constexpr bool Equality_comparable()
{
    return  has_eq<T>::value &&
            Convertible<eq_result<T>, bool>() &&
            has_neq<T>::value &&
            Convertible<neq_result<T>, bool>() ;
}

conceptがなければ、equality_compareにoperator ==を呼べない型や、呼んだ結果がboolに変換できない型を渡した場合、該当の演算子が存在しないという不可思議なコンパイルエラーになるが、conceptのおかげで、Euality_comparableの制約に合わなかったというエラーメッセージになる。

さらに、式が有効かどうか、型が有効かどうかを調べる方法を実装が提供することにより、表現方法を広げることも提案されている。

lambdaへの型制約の適用については、技術的な問題はないが、適切な文法を考案しなければならないとしている。

感想としては、型制約としてはなかなか悪くない提案だ。C++11がドラフトだった当時、conceptのあまりのややこしさにいやになり、単に有効な式やメタ関数の記述を並べる文法があればいいのにと思っていたのだ。

問題は、この提案で、concept map機能をどうやってつけるのか。Bjarne Stroustrupは以前のインタビューで、concept mapのないconceptなんて使いたくないと答えていたはずだが。

No comments: