yohhoyの日記

技術的メモをしていきたい日記

ローカルクラスとテンプレート引数

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)以降は独自拡張としてこの用法を許容している。

STLアルゴリズムと組み合わせた例:

#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