Рассмотрите пишущего декоратора, который поддержит кэш, и Ваша функция не будет загрязнена путем кэширования кода:
def cacheResults(aFunc):
'''This decorator funcion binds a map between the tuple of arguments
and results computed by aFunc for those arguments'''
def cachedFunc(*args):
if not hasattr(aFunc, '_cache'):
aFunc._cache = {}
if args in aFunc._cache:
return aFunc._cache[args]
newVal = aFunc(*args)
aFunc._cache[args] = newVal
return newVal
return cachedFunc
@cacheResults
def ReallyCalc(a):
'''This function does only actual computation'''
return pow(a, 42)
, Возможно, это не выглядит большим сначала, но можно использовать cacheResults()
где угодно, Вам не нужны ключевые параметры. Возможно создать подобного декоратора, который работал бы также на параметрические усилители ключевого слова, но это не казалось необходимым на этот раз.
Они бывают разных типов : templates конструируют новые типы из шаблона.
Вы должны создать другие экземпляры ваших друзей по классу:
template <typename T>class MyClass
{
T v;
public:
MyClass(T v):v(v){}
template<typename T2>void foo(MyClass<T2> obj)
{
std::cout << v << " ";
std::cout << obj.v << " ";
std::cout << v + obj.v << std::endl;
}
// Any other type of MyClass is a friend.
template <typename U>
friend class MyClass;
// You can also specialize the above:
friend class MyClass<int>; // only if this is a MyClass<int> will the
// other class let us access its privates
// (that is, when you try to access v in another
// object, only if you are a MyClass<int> will
// this friend apply)
};
Добавить MyClass
как дружественный класс:
template<typename T> class MyClass
{
template<typename TX>
friend class MyClass;
...
Согласно Стандарту C ++ 14.5.3 / 3:
Дружественный шаблон может быть объявлен внутри класса или шаблона класса. Шаблон дружественной функции может быть определен внутри класса или шаблона класса, но шаблон класса друга не может быть определен в классе или шаблоне класса. В этих случаях все специализации класса друга или шаблона функции друга являются друзьями класса или шаблона класса, предоставляющего дружбу. [Пример:
класс A { шаблон
friend class B; // В ПОРЯДКЕ template friend void f (T) {/ * ... * /} // ОК }; —end example]
ПРИМЕЧАНИЕ. Вы должны знать, что приведенный выше код все еще может привести к ошибке с некоторыми компиляторами из-за Core Issue # 602 , который все еще открыт. Несмотря на это, приведенный выше код компилируется на GCC, Visual C ++ и Comeau.
Чтобы сделать только функцию foo
другом, вы можете написать следующее:
template<typename T> class MyClass
{
template<typename TY> template<typename TX>
friend void MyClass<TY>::foo(MyClass<TX>);
...