Тип шаблона C ++, который имеет определенный метод-член - PullRequest
0 голосов
/ 20 июня 2011

Что такое хороший способ вызвать функцию-член типа шаблона?Будет ли приведенный ниже код foo() компилироваться только для типов, для которых определена функция bla()?

class A { void bla(); };

template<typename T>
void foo() {
    T t;
    t.bla();
}

int main() {
    foo<A>();
    return 0;
}

Могу ли я использовать boost::enable_if только для определения этой функции для типов, которые имеют метод bla()?Если да, это даже хорошая идея?Я полагаю, что идея «концепций» (о которой я ничего не знаю), возможно, и должна использоваться здесь.

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Для каждого типа, с которым вы пытаетесь вызвать функцию foo, компилятор сгенерирует новую функцию foo с данным ей и скомпилирует, если вы можете скомпилировать функцию foo с данным типом, она будет работать.

Так что в вашем случае функция foo будет работать с каждым типом, который имеет функцию bla и имеет конструктор по умолчанию.

1 голос
/ 20 июня 2011

Он также будет компилироваться только для типов, которые можно конструировать по умолчанию.Компилятор выдаст ошибку для любого типа, который не является конструируемым по умолчанию и не имеет функции bla(), которая не может принимать аргументы.

1 голос
/ 20 июня 2011

Ваш пример кода выглядит правильно; Конечно, произойдет ошибка, если он будет создан для типа, в котором нет члена bla().

...