グローバルで名前付きの構造体しか認めないとか

std::for_eachを使うと,コンテナに対するループがちょっとカッコよく書けます.

#include <iostream>
#include <algorithm>
#include <vector>

void pred(int x){
    std::cout << x << std::endl;
}

int main(){
    std::vector<int> v;
    for(int i=0;i<10;i++) v.push_back(i);
    
    std::for_each(v.begin(), v.end(), pred);
    
    return 0;
}

こんな感じ.このとき,for_eachの第3引数は,関数オブジェクトでもOK.

#include <iostream>
#include <algorithm>
#include <vector>

struct pred_t{
    void operator()(int x){
        std::cout << x << std::endl;
    }
} pred;

int main(){
    std::vector<int> v;
    for(int i=0;i<10;i++) v.push_back(i);
    
    std::for_each(v.begin(), v.end(), pred);
    
    return 0;
}

こんな感じ.でもこれだと,使う場所(for_each)の場所と,定義する場所(struct定義してる場所)とが離れすぎて気持ち悪い.あとpred_tとか無駄に名前増えて気持ち悪い.で,さっきひらめいて,ローカルに,無名で構造体作ったらいけるんじゃないかと思って書いてみた.

#include <iostream>
#include <algorithm>
#include <vector>

int main(){
    std::vector<int> v;
    for(int i=0;i<10;i++) v.push_back(i);
    
    struct{
        void operator()(int x){
            std::cout << x << std::endl;
        }
    } pred;
    std::for_each(v.begin(), v.end(), pred);
    
    return 0;
}

文法的には間違ってないと思うのに.これは動きません.テンプレートの引数に,ローカルで定義された構造体は渡せないらしい.さらに,無名構造体も渡せないらしい.
将来的(いわゆるC++0xと呼ばれるバージョン)では,ラムダ式が書けるようになるのでいいけど,現状は一番上の関数ポインタ渡しが一番楽か.