C++0xで、関数の戻り値の型を2回書かずに済む方法 その2
こんなのを書いてみた。
namespace detail {
template<typename... A>
struct unnamed_ctor_impl;
template<>
struct unnamed_ctor_impl<> {
template<typename T>
operator T() const {
return T();
}
template<typename T, typename... B>
static T apply(B&&... b) {
return T(std::forward<B>(b)...);
}
};
template<typename A0, typename... A>
struct unnamed_ctor_impl<A0, A...> {
private:
A0&& a0;
unnamed_ctor_impl<A...> rest;
public:
unnamed_ctor_impl(A0&& a0, A&&... a) : a0(a0), rest(a...) {}
template<typename T>
operator T() const {
return apply<T>();
}
template<typename T, typename... B>
T apply(B&&... b) const {
return rest.template apply<T>(std::forward<B>(b)..., std::forward<A0>(a0));
}
};
} // namespace detail
template<typename... A> inline detail::unnamed_ctor_impl<A...>
unnamed_ctor(A&&... a) {
return detail::unnamed_ctor_impl<A...>(a...);
}
使用例
template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
return unnamed_ctor(x);
}
C++0xで、関数の戻り値の型を2回書かずに済む方法
戻り値の型がメタ関数とかの結果で、そのまま書くとすごく長いことがある。
template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
return typename hogehoge<typename piyopiyo<T>::result_type>::type(x); // 同じ型名を書いている
}
decltypeを使えば1回で済む。
template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
return decltype(some_function(x))(x);
}
Lua 5.2.0 (work1)の雑感
思ったこと。
- C関数から呼び出したLua関数からyieldできるようにする関係で、多少複雑になってしまった感じがする。出来なかったことが出来るようになった代償か。
- バージョン(luaL_checkversion)は、本当に必要だろうか。バージョンが違ってたらそもそも実行できるのかという疑問が。
- lua_cpcallの代用が面倒。1行のコードが4行に。ただしポインタ以外のものも渡せるのはいいかもしれない。
- 非互換が多過ぎる。しかも互換オプションはデフォルトで無効な上に、LUA_GLOBALSINDEXのように跡形もなく消えたものもある。
もちろん、これは最初の作業バージョンだから、正式リリースまでには全く違うものになっているだろう。非互換が多過ぎると書いたけど、互換オプションがデフォルトになる見込みは十分にある。
しかしLua 5.1 (work0)が2004年3月で5.1の正式リリースが2006年2月。 Lua 4.1のスナップショットが2001年5月、Lua 5.0 (work0)が2002年6月で5.0の正式リリースが2003年4月。 ということは正式リリースはまだまだ先だな。
まとめ:今から心配したってしょうがない。でもできるだけ追い続けていよう。
Lua 5.2.0 (work 1) が公開された
Lua 5.2.0の作業バージョンが公開された。
MLの投稿:[ANN] Lua 5.2.0 (work1) now available
変更点などは自分で確認しよう。以下は(ほんの)一部。
- 言語
- in-do-end (Lexical Environments)
みんなで使いどころを考えてやりましょう。
要はsetfenvでやっていたことの代替。そしてさようならget/setfenv。in {myprint=print} do myprint("Hello world") end - \xHH
- in-do-end (Lexical Environments)
- ライブラリ
- setfenv/getfenvの廃止
- ビット演算
- table.packの追加
- unpackはtable.unpackに移動
- debugライブラリはrequire()でロードしてね
- CのAPI
多過ぎな気がするので書きません。
JavaScriptのパーサを製作中
前に書いたように、JavaScriptにはブロックスコープがない。 JavaScript 1.7にはlet文というのがあるのだが、今の時点ではただの独自拡張だ。Mozilla系以外のブラウザでは動かない。 それなら、let文を使ったコードを、前に書いたような方法(function(){}()で包む)で、どのブラウザでも動くようなコードに変換すればいい。
というわけで今はJavaScriptのコードのパーサを書いている。しかしAutomatic Semicolon Insertionがめんどくさい。
これが完成すればlet以外の機能(Expression closuresのような、純粋なシンタックスシュガーの類)も実装したい。
