2015-02-18 4 views
2

Есть ли способ псевдонима статической функции-члена в C++? Я хотел бы иметь возможность вывести его в рамки, чтобы мне не нужно было полностью квалифицировать имя.с использованием псевдонима для статических функций-членов?

существу что-то вроде:

struct Foo { 
    static void bar() {} 
}; 

using baz = Foo::bar; //Does not compile 

void test() { baz(); } //Goal is that this should compile 

Моей первой мысли было использовать std::bind (как в auto baz = std::bind(Foo::bar);) или указатели на функции (как в auto baz = Foo::bar;), но это является неудовлетворительным, потому что для каждой функции я хочу, чтобы иметь возможность используйте псевдоним в, мне нужно сделать отдельную переменную только для этой функции или вместо этого сделать переменную псевдонима доступной в глобальной/статической области.

+1

Вы можете сделать 'Foo' пространство имен? –

+1

Что не так с переменной псевдонима в глобальной области? Однако вы должны использовать 'constexpr':' constexpr auto baz = & Foo: bar; 'Ваша цель - ввести имя в этой области, и' constexpr' делает именно это. –

+0

+1 для предложения использовать constexpr. В основном я не хотел беспокоиться об инициализации глобальных переменных. Глобальная инициализация - сложный бизнес. Был надеется, что на языке, который просто занимается обзором, будет механик. – Mark

ответ

5

using Неверный инструмент здесь. Просто объявите свой псевдоним (как глобальный, если вам нужно) с auto baz = &Foo::bar.

Как указано в комментариях, вы также можете сделать это constexpr, чтобы он был доступен, когда это возможно, во время компиляции в постоянных выражениях.

struct Foo { 
    static void bar() { std::cout << "bar\n"; } 
}; 

constexpr auto baz = &Foo::bar; 

void test() { baz(); } 

int main() 
{ 
    test(); 
} 

Demo

+0

Извинения за неясность. Я не хочу этого типа. Я хочу иметь функцию в области действия без необходимости полностью ее квалифицировать. Изменит вопрос. – Mark

+2

@Mark is [this] (http://coliru.stacked-crooked.com/a/a973d9d8a871acf7) что вы ищете? – quantdev

+0

да, это тот эффект, который я ищу, я просто не хотел зависеть от инициализации глобальных переменных. – Mark

0

Не очень прямой путь, но можно использовать указатель на функцию.

void (*baz)() = Foo::bar; //Does not compile 

Теперь вы можете просто позвонить baz(); для Foo :: бар;

+0

Это уродливая форма одного из неудовлетворительных решений, перечисленных мной в OP. – Mark

+0

@Mark: Это лучше, потому что бесполезное использование 'std :: bind'. Конечно, использование 'auto' было бы еще лучше. –

+0

@BenVoigt - bind было одним из двух решений, перечисленных мной в OP. Второй использовал авто. Я использую auto. – Mark

Смежные вопросы