Я предполагаю, что ваша проблема что-то вроде этого:
template <typename T>
struct Foo {
//..
void bar() {
/* most or all code here is the same for all T,
and uses nothing that depends on T. */
};
};
И вы хотели бы определить «планку» таким образом, что там будет только одна функция бара, а не одна для каждого экземпляра «Foo», т. е. вы не хотите, чтобы Foo<int>::bar
была другой функцией от Foo<double>::bar
.
Это не может быть сделано, поскольку функция «bar» является членом шаблона класса и, следовательно, каждого из его экземпляров.
То, что вы можете и должны делать вместо этого, - это определить вспомогательную (свободную) функцию, которая содержит в себе все то же самое для всего T "кода. Что-то вроде этого:
namespace {
void Foo_bar_helper(/*..*/) {
/* common code goes here. */
};
};
template <typename T>
struct Foo {
//..
void bar() {
Foo_bar_helper(/* pass the "guts" of Foo<T> here. */);
};
};
Обычно функция бара получит встраиваемый компилятор, и все, что на самом деле остается расширение «внутренность» объект Foo (если таковые имеется) в качестве параметров функции хелперов (которые вы могли бы реализовать с или без внешней связи, как вы пожелаете).
Другой вариант заключается в наследовании от базового класса, отличного от шаблона, но мне лично не нравится использовать наследование для такого рода материалов, и вам все равно придется выполнять ту же пересылку «кишок» объекта Foo (если есть).
Вы уже пробовали? – nbro
Все функции-члены класса шаблона не являются шаблонами, если только они не объявлены самим шаблоном. Но это, вероятно, не совсем то, о чем вы просите. –
, если у вас есть такой код, как этот шаблон класс Object {}, то каждая функция внутри повторяется для каждого типа класса –
user3813249