Windows Powershell имеет Попытку/Выгоду или другой механизм обработки ошибок?

Если вам нужно иметь возможность обрабатывать выражение &A::x одинаково, независимо от того, является ли x статическим или нестатическим членом A (и он может быть перегружен), тогда вам нужно передать это через какую-то другую перегруженную функцию, которая может принимать R(C::*)(Ts...) или R(C::*)(Ts...)const или R(*)(Ts...) и отправлять соответственно. Примерно так:

template 
struct UniformResolver {
    template 
    constexpr auto operator()(R (C::*func)(Ts...)) const { return resolveMember(func); }
    template 
    constexpr auto operator()(R (C::*func)(Ts...) const) const { return resolveMember(func); }
    template 
    constexpr auto operator()(R (*func)(Ts...)) const { return resolveStatic(func); }
private:
    template 
    constexpr auto resolveMember(F func) const {
        return [func](auto&&... args) {
            return std::invoke(func, std::forward(args)...);
        };
    }
    template 
    constexpr auto resolveStatic(F func) const {
        return [func](auto&&, auto&&... args) {
            return std::invoke(func, std::forward(args)...);
        };
    }
};
template 
constexpr UniformResolver uresolve {};

Это дает вам шаблон вызываемого объекта uresolve, который адаптирует указатель вашей функции, возвращая вызываемый объект, который можно вызывать единообразным образом и который делегирует указателю вашей функции. Вот как вы бы это использовали:

struct A {
    int mem(int a) const { return a * 2; }
    int mem(int a, int b) const { return a + b; }
    static int stat(int a) { return a * 2; }
    static int stat(int a, int b) { return a + b; }
};

int main() {
    A a;
    auto mem1 = uresolve(&A::mem);
    auto mem2 = uresolve(&A::mem);
    auto stat1 = uresolve(&A::stat);
    auto stat2 = uresolve(&A::stat);

    std::cout << mem1(a, 1) << '\n';
    std::cout << mem2(a, 1, 2) << '\n';
    std::cout << stat1(a, 1) << '\n';
    std::cout << stat2(a, 1, 2) << '\n';
}

Живая демо

18
задан casademora 14 October 2008 в 19:19
поделиться

3 ответа

Вы используете Trap [exception-type] {} блок перед кодом, для которого Вы хотите обработать исключения.

8
ответ дан 30 November 2019 в 09:11
поделиться

Я записал об этом в моем столбце TechNet Magazine (technetmagazine.com, если Вам интересно).

Первый, PowerShell v2 будет иметь стандартную Попытку... Выгода, которая является большой.

существующая оболочка (v1) имеет поддержку прерывания {} конструкции. Они должны быть определены до случая исключения. Кроме того, большинство cmdlets требует - параметр "ОСТАНОВКИ" EA для них генерировать trappable исключение. Прерывания могут быть определены в любом объеме и будут "пузыриться" вплоть до захваченного или пока они не поражают глобальное (оболочка) объем.

В конце прерывания, выполнитесь, Продолжают возвращаться к следующей строке кода в том же объеме как прерывание или выполнять Повреждение, чтобы покинуть текущую область и бросить исключение.

7
ответ дан 30 November 2019 в 09:11
поделиться

Вот кто-то (Adam Weigert), который реализовал попытку/выгоду/наконец с помощью powershell. Я использую это вместо встроенного прерывания staement. Кажется более естественным.

http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx

2
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: