2014-12-05 4 views
-1

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

так что если у вас есть код этой

template <typename T> 
class CLASS{ 

}; 

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

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

+0

Вы уже пробовали? – nbro

+0

Все функции-члены класса шаблона не являются шаблонами, если только они не объявлены самим шаблоном. Но это, вероятно, не совсем то, о чем вы просите. –

+0

, если у вас есть такой код, как этот шаблон класс Object {}, то каждая функция внутри повторяется для каждого типа класса – user3813249

ответ

1

Наследование функции от базового класса

class BASE_CLASS { 
public: 
    static void not_a_templated_function(); 
}; 

template <typename T> 
class CLASS: public BASE_CLASS { 

}; 
1

Я предполагаю, что ваша проблема что-то вроде этого:

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 (если есть).

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