Я пытаюсь (и не удается) написать тип, который определяет выражения Eigen. Другими словами, я хотел бы иметь возможность обнаруживать такие вещи, как A * A + B
и т. Д., Где A
и B
- Eigen
матрицы/векторы. В настоящее время я делаю это:Написание черты типа для обнаружения матричных выражений в Eigen
template<typename T>
struct is_matrix_expression : std::false_type
{
};
template<typename Derived> // specialization
struct is_matrix_expression<Eigen::MatrixBase<Derived>> :
std::true_type
{
};
Обратите внимание, что Eigen::MatrixBase<Derived>
является (шаблон) основанием для всех возможных выражений Эйгена (например, decltype(A * A + B)
и т.д.). Тем не менее, общий шаблон выбирается, так как он лучше подходит для чего-то вроде decltype(A * A + B)
, а не для специалиста MatrixBase<Derived>
.
Как я могу каким-то образом обеспечить выделение специализации? Или, другими словами, включить специализацию для всех возможных детей Eigen::MatrixBase<Derived>
? Я немного играл с SFINAE по std::is_base_of
, но для этого требуется явный тип, а не шаблон, где тип выражения (в данном случае Derived
) неизвестен заранее.
Эквивалентно, как я могу определить, является ли тип X
дочерним по отношению к Base<T>
, для некоторого типа T
?
Капля этого 'typename'. Вы пишете 'typename std :: template vector'? –
Является ли [этот старый ответ] (http://stackoverflow.com/a/12182195/27678) полезным? – AndyG
Я думаю, что ваша проблема в том, что 'decltype (A * A + B)' не является 'MatrixBase' ... это будет похоже на 'CwiseBinaryOp ' right? –
Barry