2014-01-03 5 views
4

Можно ли смешивать конструкторы с фиксированными параметрами и шаблонами конструктора?Смешивающие конструкторы с фиксированными параметрами и конструкторами с шаблонами конструктора

Мой код:

#include <iostream> 

class Test { 
    public: 
     Test(std::string, int, float) { 
      std::cout << "normal constructor!" << std::endl; 
     } 

     template<typename ... Tn> 
     Test(Tn ... args) { 
      std::cout << "template constructor!" << std::endl; 
     } 
}; 

int main() { 
    Test t("Hello World!", 42, 0.07f); 
    return 0; 
} 

Это дает мне "шаблон конструктор!". Есть ли способ, который называется мой обычный конструктор?

+0

Именно то, что тип должен компилятор интерпретирует строку быть? –

+0

@Captain Obvlious: Я не понимаю ваш вопрос, но теперь вижу, что «Hello World!» интерпретируется как char *, а не std :: string, и, таким образом, используется конструктор шаблонов. – gartenriese

+0

@gartenriese: Это не «интерпретируется» ... это ** есть ** 'const char *'. Шаблон не делает никакой интерпретации для вас. Я думаю, что это то, что C.O. хотел указать. –

ответ

6

Конечно, в случае двух одинаковых хороших матчей, не-шаблон является предпочтительным:

Test t(std::string("Hello"), 42, 0.07f); 
+0

Это интересный конструктор 'std :: string (const char *, int, float)'. – ScarletAmaranth

+0

@ScarletAmaranth: Shh ... :-) –

+0

Спасибо, это ответ. Если вы скорректируете свои скобки, я буду отмечать его как принятый ответ. – gartenriese

3

C++ знает два основных типа строк: std::string и нулевых -завершённых массивов символов. Вместо того, чтобы исправить ошибку на стороне вызывающего абонента (как это было предложено Kerrek SB), вы можете добавить еще одну перегрузки:

class Test { 
public: 
    Test(std::string, int, float) { 
     std::cout << "normal constructor!" << std::endl; 
    } 

    Test(const char*, int, float) { 
     std::cout << "normal constructor 2!" << std::endl; 
    } 

    template<typename ... Tn> 
    Test(Tn ... args) { 
     std::cout << "template constructor!" << std::endl; 
    } 
}; 

Live example

Вы можете также использовать делегирование конструкторов для реализации одного из обычных конструкторов с точкой зрения другой, чтобы избежать дублирования кода, например

Test(const char* c, int i, float f) 
    : Test(std::string(c), i, f) 
{ 
} 

Live example

+0

Спасибо, что напомнили мне о делегировании конструкторов! Я бы поднял тебя, но у меня недостаточно репутации. Сожалею! – gartenriese

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