Членская проблема доступа класса C++ с шаблонами

Рассмотрите пишущего декоратора, который поддержит кэш, и Ваша функция не будет загрязнена путем кэширования кода:

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() где угодно, Вам не нужны ключевые параметры. Возможно создать подобного декоратора, который работал бы также на параметрические усилители ключевого слова, но это не казалось необходимым на этот раз.

11
задан Fire Lancer 21 October 2009 в 07:03
поделиться

2 ответа

Они бывают разных типов : 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)
};
11
ответ дан 3 December 2019 в 06:46
поделиться

Добавить 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>);
 ...
7
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: