Выборочное включение функции класса Template - PullRequest
2 голосов
/ 03 января 2011

У меня есть шаблон класса, внутри которого у меня есть нормальная функция. Но я хочу включить эту обычную функцию только для определенных экземпляров шаблонного класса. Я посмотрел на boost :: enable_if, и он точно не соответствует моим потребностям / может быть, я не могу использовать его для своих нужд.

typedef boost::mpl::vector< bool, int, double >  CheckTypes;

template<class X>
class P
{
    void init( int x, 
       typename boost::enable_if< boost::mpl::contains<CheckTypes, X> >::type* dummy = 0);
};

Может ли кто-нибудь помочь mw как решить эту проблему? Важно то, что решение не должно ожидать ничего от вызывающего кода. И класс явно создан.

Спасибо, Gokul.

Ответы [ 2 ]

2 голосов
/ 03 января 2011

Один из вариантов - использовать статическое утверждение. Функции-члены шаблонных классов создаются лениво, что означает, что если они никогда не будут вызваны, код для них не будет сгенерирован. Это означает, что вы можете написать функцию как обычно, ожидая, что она когда-либо будет вызываться только для экземпляров bool, int или double, а затем вставить статическое утверждение в эту функцию, которая проверяет, что это действительно так.

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

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

void Init(P<int>& toInit);
void Init(P<double>& toInit);
void Init(P<bool>& toInit);

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

2 голосов
/ 03 января 2011

enable_if обычно используется для различения различных определений функции.В определенном смысле это более мощный способ перегрузки.

Похоже, вы пытаетесь включить функцию только при выполнении условия, а выдает ошибку компиляции иначе, так как у вас есть одно определение init.Если это правильно, вы можете вместо этого заглянуть в BOOST_STATIC_ASSERT (или static_assert в c ++ 0x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...