2015-03-03 2 views
3

У меня есть следующий код в C++:Лучший способ написать условно выбираемый конструктор

struct A; 

struct B 
{ 
    B(){} 

    template<typename T> 
    B(T param){} 
}; 

Я хочу шаблон конструктора быть действительным только тогда, когда имяТипа T конвертируется к типу A. Каков наилучший способ сделать это?

+0

Извините, я смешал C# и C++, я работаю на обоих языках, и я запутался. Я только что редактировал вопрос, чтобы исправить код. –

+0

Помните, что MSVC2013 имеет проблемы с наилучшими практическими ответами на эту проблему в моем опыте. – Yakk

ответ

10

Вы хотите включить конструктор еслиTконвертируется в A? Используйте std::enable_if и std::is_convertible:

template < 
    class T, 
    class Sfinae = typename std::enable_if<std::is_convertible<T, A>::value>::type 
> 
B(T param) {} 

Это работает путем применения SFINAE; если T не конвертируется в A, замена не будет выполнена, и конструктор будет удален из набора перегрузок кандидатов.

+1

Второй аргумент шаблона не нуждается в имени. Но это хорошо –

+2

@ BЈовић Я знаю, но я обычно использую именно это имя как часть встроенной документации. – Angew

+0

В сочетании с примечанием «14.8.1/7» стандарта я нахожу ваш ответ очень хорошим. Благодарю. –

Смежные вопросы