2015-12-08 3 views
0

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

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

Я хотел бы, чтобы избежать перемещения eggs() в foo имен или создать новое пространство имен для него (например, foo::bar_::eggs(), тьфу).

ответ

4

Нет. Это не то, как работают шаблонные классы. То, что вы хотите сделать, невозможно в C++.

+1

Нет, вы не можете этого сделать. Но вы всегда можете использовать typedefs для сокращения имени. typedef foo :: bar Tbar; Tbar :: eggs(); –

1

Помните, что foo::bar не обозначает ни одного типа, а только шаблон, который может быть использован для создания других типов.

Помимо использования псевдонимов typedefs/type (через using), возможно, у вас есть шаблонный шаблон без шаблонов для ваших шаблонов, а затем введите свои статические элементы. Если вы используете публичное наследование, изменение статического члена в любом из шаблонных классов изменится во всех них.

0

Вы можете сделать параметр шаблона необязательным, и вы можете определить специализированный шаблон. Как это:

namespace foo { 

template <typename T = void> class bar { 
public: 
    static void eggs() { cout << "First there was the egg" << endl; } 
}; 

template <> class bar<void> { 
public: 
    static void eggs() { 
    cout << "Then there was the chicken... or was it?" << endl; 
    } 
}; 
} 

auto main() -> int { 
    foo::bar<int>::eggs(); // egg 
    foo::bar<>::eggs(); // chicken 

    return 0; 
} 
1

После экспериментов с кодом:

Я хочу добавить статическую функцию в шаблон класса, который доступен без передачи параметров шаблона первым. Это возможно?

namespace foo { 
    template <typename T> 
    class bar { 
    public: 
    static void eggs(); 
    }; 
} 

foo::bar<some_t>::eggs(); // works 
foo::bar::eggs(); // does not work 

Я хотел бы, чтобы избежать перемещения яйца() в пространстве имен Foo или создать новое пространство имен для него (например, Foo :: бар _ :: яйца(), тьфу).

Я пришел к выводу, что первый экземпляр

foo::bar<some_t>::eggs(); // works while 
foo::bar::eggs(); // doesn't 

связано с тем, что при работе с шаблонами, все, что в классе должен быть по отношению к конкретному объекту, даже если вы не хотите, чтобы функция была. Я даже попытался использовать указатели на функции и попытался сохранить их в классе шаблонов, и безрезультатно, я даже не смог их скомпилировать. В этой ситуации я не вижу большого выбора для вас. Там могут быть и другие трюки, которые кто-то может знать, но не из того, что я вижу.

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