是否可以覆盖std::local上的多个方面?

例如,举一个比较人为的例子:

#include <locale>

class NumberFacet : public std::numpunct<char>
{
protected:
    char do_decimal_point() const override
    {
        return '.';
    }

    char do_thousands_sep() const override
    {
        return ',';
    }
};

class MoneyFacet : public std::moneypunct<char>
{
protected:
    char do_decimal_point() const override
    {
        return '.';
    }

    char do_thousands_sep() const override
    {
        return ',';
    }
};

我知道我可以像这样覆盖std::locale的一个方面来创建一个新的locale变量。
std::locale locale(std::locale(), new NumberFacet());

我还要如何传递MoneyFacet

我似乎无法做到这一点:
std::locale locale(std::locale(std::locale(), new NumberFacet()), new MoneyFacet());

有更好的方法吗?

最佳答案

IOStreams库没有为您提供更好的编写方法,但是您可以利用递归来完成工作。由于注入(inject)新的语言环境始终涉及从旧的语言环境进行复制,因此您可以连续递归以使用提供的构面构建新的语言环境。

template<class...>struct types{constexpr types(){}};
template<class...Ts>constexpr types<Ts...> types_t{};

template<class L, class F>
L makeloc(L loc, types<F>, int) {
    return std::locale(loc, new F{});
}

template<class L, class F, class... Fs>
L makeloc(L loc, types<F, Fs...>, long) {
    return makeloc(std::locale(loc, new F{}), types_t<Fs...>, 0);
}

template<class S, class L, class... Fs>
void imbue(S& s, L loc, types<Fs...> facets) {
    s.imbue(makeloc(loc, facets, 0));
}

int main() {
    imbue(std::cout, std::locale(), types_t<MoneyFacet, NumberFacet /*, ... */>);
}

关于c++ - 覆盖std::locale上的多个方面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34855812/

10-14 07:02