Если вам нужно иметь возможность обрабатывать выражение &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';
}
Вы используете Trap [exception-type] {}
блок перед кодом, для которого Вы хотите обработать исключения.
Я записал об этом в моем столбце TechNet Magazine (technetmagazine.com, если Вам интересно).
Первый, PowerShell v2 будет иметь стандартную Попытку... Выгода, которая является большой.
существующая оболочка (v1) имеет поддержку прерывания {} конструкции. Они должны быть определены до случая исключения. Кроме того, большинство cmdlets требует - параметр "ОСТАНОВКИ" EA для них генерировать trappable исключение. Прерывания могут быть определены в любом объеме и будут "пузыриться" вплоть до захваченного или пока они не поражают глобальное (оболочка) объем.
В конце прерывания, выполнитесь, Продолжают возвращаться к следующей строке кода в том же объеме как прерывание или выполнять Повреждение, чтобы покинуть текущую область и бросить исключение.
Вот кто-то (Adam Weigert), который реализовал попытку/выгоду/наконец с помощью powershell. Я использую это вместо встроенного прерывания staement. Кажется более естественным.
http://weblogs.asp.net/adweigert/archive/2007/10/10/powershell-try-catch-finally-comes-to-life.aspx