Template class, function specialization

后端 未结 3 1298
旧巷少年郎
旧巷少年郎 2021-02-09 13:40

I want to have a template class that looks something like what I have down below. Then, I want a function in it with a template specialization depending on a CLASS template para

相关标签:
3条回答
  • 2021-02-09 14:12

    This is called partial template specialisation. It looks like this:

    template<typename _T, size_t num>
    class FooBase
    {
    };
    
    template <typename _T, size_t num>
    class Foo : public FooBase<_T,num>
    {
        void Func()
        {
            printf("Hello world!");
        }
    };
    
    
    template <typename _T>
    class Foo<_T,1> : public FooBase<_T,num>
    {
        void Func()
        {
            printf("Hi!");
        }
    }
    
    0 讨论(0)
  • 2021-02-09 14:22

    There are no partial specialisations of function templates, and to partially specialise a member you need to first partially specialise the class template.

    template< typename _T, size_t num >
    struct Foo {
        void Func() {
            printf("Hello world!");
        }
    };
    
    template< typename _T >
    struct Foo< _T, 1 > {
        void Func() {
            printf("Hi!");
        }
    };
    

    Now, if Foo also contains methods other than Func whose implementation is independent of the value for num, and you don't want to duplicate their implementation in the specialization of Foo, you can apply the following pattern:

    template< typename _T, size_t num >
    struct FooFuncBase {
        void Func() {
            printf("Hello world!");
        }
    };
    
    template< typename _T >
    struct FooFuncBase< _T, 1 > {
        void Func() {
            printf("Hi!");
        }
    };
    
    template< typename _T, size_t num >
    struct Foo : public FooFuncBase< _T, num > {
      void OtherFuncWhoseImplementationDoesNotDependOnNum() {
        ...
      }
    };
    

    Or, using CRTP:

    template< typename _Derived, typename _T, size_t num >
    struct FooFuncBase {
        void Func() {
            static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
            printf("Hello world!");
        }
    };
    
    template< typename _Derived, typename _T >
    struct FooFuncBase< _Derived, _T, 1 > {
        void Func() {
            static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
            printf("Hi!");
        }
    };
    
    template< typename _T, size_t num >
    struct Foo : public FooFuncBase< Foo< _T, num >, _T, num > {
      void OtherFuncWhoseImplementationDoesNotDependOnNum() {
        printf("Other");
      }
    };
    
    0 讨论(0)
  • 2021-02-09 14:29
    struct Otherwise { };
    template<size_t> struct C : Otherwise { };
    
    // don't use _Uppercase - those names are reserved for the implementation
    // (i removed the '_' char)
    template <typename T, size_t num>
    class Foo
    {
    public:
        void Func() { Func(C<num>()); }
    
    private:
        // If num == 1, I want to call this function...
        void Func(C<1>)
        {
            printf("Hi 1!");
        }
    
        // If num == 2, I want to call this function...
        void Func(C<2>)
        {
            printf("Hi 2!");
        }
    
        // Otherwise, I want to call this version.
        void Func(Otherwise)
        {
            printf("Hello world!");
        }
    
        //// alternative otherwise solution:
        // template<size_t I>
        // void Func(C<I>) { .. }
    };
    
    0 讨论(0)
提交回复
热议问题