具有未指定模板参数的虚拟方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有未指定模板参数的虚拟方法相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <array>
#include <vector>

using namespace std;

// Currently I have code much like this one:

template <const uint32_t N>
using VectorN = array<double, N>;


template <const uint32_t N>
class ITransformable {
public:
    virtual vector<VectorN<N>>&  positions() = 0;
};


class SomeTransformer {
public:
    template <const uint32_t N>
    void operator()(ITransformable<N>& transformable) const {
        /* implementation */
    }
};

// Then I want to create interface like this.

template <const uint32_t N>
class ITransformer {
public:
    virtual void operator()(ITransformable<N>& transformable) const = 0;
};

// And finally implement it for SomeTransformer:
// 
// Notice that class is not template, this is intentional.
//
// class SomeTransformer : public ITransformer<N> {
// public:
//     virtual void operator()(ITransformable<N>& transformable) const {
//         /* implementation */
//     }    
// }

实际上,现在对我来说似乎是不可能的。否则,此类会继承不确定的接口专业化数量...

但是仍然有可能,至少对于有限数量的尺寸N

template <template <typename> class C>似乎相关,但是我不知道该如何应用。

编辑我想要的是这样的:

class SomeTransformer : 
    public ITransformer<2>, 
    public ITransformer<3>, 
    public ITransformer<4>, 
    ..., 
    public ITransformer<N> { 
    /* ... */ 
};

对于代码中曾经使用过的N。正如我所说,这似乎是不可能的。

答案

您可以实现您想要的或接近实现的目标。这是我的建议:


#include <type_traits>
#include <utility>

template<std::size_t N>
struct ITransformer {};

template<class T>
class SomeTransformer_h { };

template<std::size_t... Indices>
class SomeTransformer_h<
    std::integer_sequence<std::size_t, Indices...>> :  
    public ITransformer<1 + Indices>... { };


template<std::size_t N>
class SomeTransformer : public SomeTransformer_h<
    std::make_index_sequence<N>
> { };

int main() {
    SomeTransformer<5> a;
    ITransformer<1>& ref = a;
    ITransformer<4>& ref2 = a;
    ITransformer<5>& ref3 = a;
}

现在对于任何N,它将使SomeTransformer继承从1到N的所有ITransformer

另一答案

由于未在任何地方声明N,因此无法使用它。您需要类似:

class SomeTransformer : public ITransformer<5> {
public:
    virtual void operator()(ITransformable<5>& transformable) const {
        /* implementation */
    }    
};

或使其成为模板类:

template <uint32_t N>
class SomeTransformer : public ITransformer<N> {
public:
    virtual void operator()(ITransformable<N>& transformable) const {
        /* implementation */
    }    
};

UPDATE

C中没有无动态继承。因此,您无法实现。

以上是关于具有未指定模板参数的虚拟方法的主要内容,如果未能解决你的问题,请参考以下文章

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

在 C++11 中传递具有未指定参数的函数?

具有模板函数名称的可变参数模板

从可变参数模板中扩展的 decltype 继承

限制指针类型模板参数和覆盖模板基类的虚拟方法

如何在片段着色器中进行自定义模板测试