2015-04-15 2 views
3

Прошу прощения за неопределенный заголовок, но я хочу создать класс шаблона, который определен для некоторого указателя на указатель на функцию. В настоящее время у меня есть это:Как использовать тип класса в качестве аргумента для шаблона

template<class TB, TB TCons, class TF, TF TDes> 
struct foo{} 

Который используется следующим образом:

using bar = foo<decltype(&tb), &tb, decltype(&tf), &tf>; 

Однако, совершенно очевидно, код избыточности и определения типов &tb и &tf, а также сами указатели , Есть ли способ создать класс шаблона, чтобы я мог сделать что-то подобное?

using bar = foo<&tb, &tf>; 
+0

В настоящее время нет. Есть предложения, позволяющие что-то вроде 'template ', но это всего лишь предложения. –

+0

Вам действительно нужны значения указателей во время компиляции? – gomons

+0

@gomons Нет, но это не больно. – user975989

ответ

1

На C++ 17, мы можем теперь использовать auto как тип параметра шаблона, так что теперь мы можем сделать это:

template<auto TCons, auto TDes> 
struct foo{}; 

Если нам нужно получить типы TCons и TDes, мы можем использовать decltype.

0

Это ближайшее место. (Не полное решение.)

Он использует автоматический отчёт шаблона параметров функции, но вам все равно придется дважды указывать список параметров. Другой подход состоял в том, чтобы использовать вывод типа автоматического возврата (C++ 1y), но у него есть проблема, что вы не можете получить аргументы за барьером параметров.

template<class TB, class TF> 
struct foo_h { 
    template<TB TCons, TF TDes> 
    struct f { 
    typedef foo<TB,TCons,TF,TDes> type; 
    }; 
}; 

template<class TB, class TF> 
foo_h<TB,TF> foo_t(TB, TF); 

using bar = decltype(foo_t(&tb,&tf))::f<&tb,&tf>::type; 

Возможно, это помогает кому-то опираться. Но я не думаю, что есть решение.

Это вышеупомянутая C++ 1y решение, но, как вы можете видеть, что есть проблема прохождения фактические переменные:

template<class TB, class TF> 
auto foo_t(TB b, TF f) { 
    return foo<TB,&tb,TF,&tf>(); 
    //   ^^^ ^^^ using b and f doesn't work as they don't refer to globals 
} 

using tofu = decltype(foo_t(&tb,&tf)); 
0

К сожалению, это пока не представляется возможным.

0

Препроцессор зло, помните:

#define FUNC(f) decltype(f), f 

using bar = foo<FUNC(&tb), FUNC(&tf)>; 
Смежные вопросы