2016-08-09 2 views
1

私は質問ではなく、理論的である知っているが、プレースホルダは、例えばのようなテンプレートとして定義される場合、私は思う:使用方法と非形式のテンプレートパラメータを使用してstd :: bindのプレースホルダが実装されないのはなぜですか?

namespace std { 
    namespace placeholders { 
     template <size_t> struct placeholder { constexpr placeholder() {}; }; 
     template <size_t N> constexpr placeholder<N> _{}; 
    } 
} 

std::bind(foo, std::placeholders::_<1>, std::placeholders::_<2>); 

またはC++ 11のために:

用法
namespace std { 
    namespace placeholders { 
     template <size_t> struct _ { }; 
    } 
} 

std::bind(foo, std::placeholders::_<1>{}, std::placeholders::_<2>{}); 

コードではその明確さは失われず、私たちはそれを使用していくつかの素晴らしいメタプログラミングを行うことができます。だから... std::bindのプレースホルダが非型テンプレートパラメータを使って実装されているのはなぜですか?

+7

その構文は合法的に見えません。 '_ <1>'は依然として型であり、型として値を渡すことはできません: '_ <1> {}'が必要ですか?または 'template struct placeholder {constexprプレースホルダー(){};};テンプレート constexprプレースホルダー _ {}; '?そして、2日目になると、C++ 11には存在しない変数テンプレートが必要になります。それで、あなたは何を知りたいですか? – Yakk

答えて

7

変数テンプレートがC++ 11に存在しませんでした。ここにはstd::bindが追加されています。

_1名前は短く、boostからはstd::bindが作成されました。

あなたは簡単に自分の同様のプレースホルダを書くことができます。

namespace my_placeholders { 
    template <int> struct placeholder { constexpr placeholder() {}; }; 
    template <int N> constexpr placeholder<N> _{}; 
} 
namespace std { 
    template<int N> 
    struct is_placeholder< ::my_placeholders::placeholder<N> >: 
    std::integral_constant<int, N> 
    {}; 
} 

となりましmy_placeholders::_<1>すべての重要な方法で_1と同等の有効std::bindプレースホルダです。

ラムダと比較してstd::bindで動作することを迷惑にしていると、実際にこのような機能をスタンダードポストC++ 14に追加するのは面倒ではありませんでした。

関連する問題