4

テンプレートに基づいてファイルからプログラムを読み取るのに問題があります。次に例を示します。

bool parse(basic_ifstream<T> &file)
{
    T ch;
    locale loc = file.getloc();
    basic_string<T> buf;
    file.unsetf(ios_base::skipws);
    if (file.is_open())
    {
        while (file >> ch)
        {
            if(isalnum(ch, loc))
            {
                buf += ch;
            }
            else if(!buf.empty())
            {
                addWord(buf);
                buf.clear();
            }
        }
        if(!buf.empty())
        {
            addWord(buf);
        }
        return true;
    }
    return false;
}

これは、このクラスをでインスタンス化すると機能しますが、 (明らかに)<char>使用すると問題が発生します。<wchar_t>

クラスの外では、私は以下を使用しています:

for (iter = mp.begin(); iter != mp.end(); ++iter )
{
    cout << iter->first << setw(textwidth - iter->first.length() + 1);
    cout << " " << iter->second << endl;
}

このデータ構造体(これはa)からすべての情報を書き込むために、予測どおり、配列でないmap<basic_string<T>, int>場合はcoutが爆発します。iter->firstchar

私はオンラインで調べましたが、コンセンサスはwcoutを使用することですが、残念ながら、このプログラムではコンパイル時にテンプレートを変更できる必要があるため(<char>-> <wchar_t>)、coutまたはwcoutを選択するだけでどうすればよいかわかりません。つまり、多くのコードを変更せずにワイド文字を読み書きする方法がない限りです。

この説明がぎこちなく複雑に聞こえる場合は、お知らせください。できる限り対応させていただきます。

4

2 に答える 2

6

特性クラスを使用します。コードで cout を直接参照する代わりに、参照してから std::cout とwcout にtraits<T>::cout特化します。traits<char>traits<wchar_t>

更新しました

template <typename T>
class traits {
public:
    static std::basic_ostream<T>& tout;
};

template<>
std::ostream& traits<char>::tout = std::cout;

template<>
std::wostream& traits<wchar_t>::tout = std::wcout;

int _tmain(int argc, _TCHAR* argv[])
{
    traits<char>::tout<<"Ascii";
    traits<wchar_t>::tout<<L"Unicode";
    return 0;
}
于 2010-03-16T23:14:37.980 に答える
0

Sure, just redefine the templates and use a typedef:

#ifdef USE_UNICODE
typedef wchar_t tchar_t
#else
typedef unsigned char tchar_t
#endif

Then you can use the templates of most standard C++ functions/containers:

typedef std::basic_string<tchar_t> tstring

etc.

于 2010-03-16T23:16:19.767 に答える