C++11から、テンプレート引数として関数内のローカルな型を指定できるようになった。(C++03以前ではNG)
template <typename T> void foo(T const& t) {} struct X{}; int main() { struct Y{}; foo(X()); // C++03/C++11:well-formed foo(Y()); // C++03:ill-formed, C++11:well-formed }
なお、Visual Studio 2005(MSVC8)以降は独自拡張としてこの用法を許容している。
#include <algorithm> struct Data { std::string key, value; }; const Data* search_by_value(const Data* data, std::size_t n, const std::string& v) { struct CompByValue { const std::string& v_; CompByValue(const std::string& v) : v_(v) {} bool operator()(const Data& d) const { return (d.value == v_); } }; const Data* p = std::find_if(data, data+n, CompByValue(v)); return (p != data+n) ? p : NULL; }
ただし、C++11ラムダ式が利用できるならこちらを利用すべき。
const Data* search_by_value(const Data* data, std::size_t n, const std::string& v) { auto p = std::find_if(data, data+n, [&](const Data& d) { return (d.value == v); }); return (p != data+n) ? p : NULL; }
関連URL