C ++: тип виртуального шаблона Erasure Временное решение

Я использую шаблон дизайна стирания типа, чтобы предоставить независимый от шаблона интерфейс для одного из моих шаблонных классов. Однако я столкнулся с проблемой, заключающейся в том, что один из методов, которые я хочу раскрыть, который объединяет два шаблонных экземпляра в третий экземпляр с другим аргументом параметра константы шаблона, кажется, требует использования виртуальных методов шаблона, которые являются недопустимыми.

Это мой код:

#include <stdlib.h>

template<size_t N>
class bar
{
template<size_t M>
bar<M+N> fuse(const bar<M>& rhs) { return bar<M+N>(); }
};

class bar_any_N
{
private:
class abstract_base
{
virtual bar_any_N fuse(const abstract_base* rhs) = 0;

template<size_t M>
virtual bar_any_N fuse_accept(const bar<M>& lhs) = 0;
};

template<size_t N>
class wrapper : public abstract_base
{
private:
bar<N> m_bar;
public:
wrapper(const bar<N>& the_bar) : m_bar(the_bar) { }

bar_any_N fuse(const abstract_base* rhs) { return rhs->fuse_accept(*this); }

template<size_t M>
bar_any_N fuse_accept(const bar<M>& lhs) { return lhs.m_bar.fuse(this->m_bar) }
};

abstract_base* m_ptr;
public:
template<size_t N>
bar_any_N(const bar<N>& the_bar) { m_ptr = new wrapper<N>(the_bar); }

};

int main()
{
bar<1> b1;
bar<2> b2;
bar_any_N b1_erased(b1);
bar_any_N b2_erased(b2);

bar_any_N b3 = b1_erased.fuse(b2_erased);

return 0;
}

У кого-нибудь есть другой способ реализовать это, который не требует виртуального члена шаблона?

РЕДАКТИРОВАТЬ: Цель этого «независимого от шаблона интерфейса» состоит в том, чтобы передать векторам экземпляры стержня с различными параметрами шаблона в функции:

std::vector< bar_any_N > vec;
vec.push_back(bar<2>());
vec.push_back(bar<5>());
foo_func(vec);

РЕДАКТИРОВАТЬ:

Вот более простой рабочий пример с методом печати вместо вышеупомянутого метода плавкого предохранителя, который показывает, как я хотел бы, чтобы это работало:

http://codepad.org/8UbJguCR

2

Решение

Делайте наизнанку стирание типа.

struct bar_raw
{
std::size_t N;
explicit bar_raw( std::size_t n ):N(n) {}
bar_raw fuse( const bar_raw& rhs ) { return bar_raw(N+rhs.N); }
};
template<size_t N>
struct bar: bar_raw
{
bar():bar_raw(N) {}
template<size_t M>
bar<M+N> fuse(const bar<M>& rhs) { return bar<M+N>(); }
};

Держите все состояние в bar_raw, Иметь красивый интерфейс, который помогает писать код в bar<N>, как и n-арные индексы.

Когда прошло bar<N> набрать стереть, вы игнорируете bar<N> компонент и тип стереть bar_raw, что довольно тривиально.

Вы могли бы позвонить bar_raw ваш bar_any если хочешь или можешь уйти bar_raw как детали реализации, и обернуть его в bar_any это все красиво.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]