Я играю с общей шаблонной функцией шаблона для вывода контейнеров в консоль.default const char * аргумент шаблона в функции шаблона шаблона
Для этого я хочу предоставить разделитель по умолчанию. Он работает по умолчанию аргумент шаблона для const char (но тогда мне нужно сделать глупую строчную конструкцию) или по умолчанию аргумент const char * function (я знаю, что это идеальное решение и может быть предпочтительным).
Что я хочу узнать, есть ли способ по умолчанию аргументировать шаблон для определенного значения const char *? Поскольку аргументы шаблона предназначены для объявления типов не таких производных, как (*, & и т. Д., Но const работает?) Я не уверен, что это возможно, но аргумент шаблона по умолчанию и более эффективный, чем первая реализация под ним, - это то, что я ищу для.
#include <cstdlib>
#include <iostream>
#include <thread>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
// This Works
template <template <typename , typename > class Container, class Element, class Allocator, const char sep= ','>
void displayContents(const Container<Element, Allocator>& inputContainer)
{
string seperator(1, sep);
copy(inputContainer.cbegin(), inputContainer.cend(), ostream_iterator<Element>(cout, seperator.c_str())); // not all that efficient...
cout << endl;
};
// This works fine
template <template <typename, typename > class Container, class Element, class Allocator>
void displayContentsWithDefaultArgs(const Container<Element, Allocator>& inputContainer, const char* sep = ",")
{
copy(inputContainer.cbegin(), inputContainer.cend(), ostream_iterator<Element>(cout, sep));
cout << endl;
};
// how can we get this to work (more effectively than displayContents above?)
template <template <typename, typename > class Container, class Element, class Allocator, const char* sep = ",">
void displayContentsWithDefaultTemplateArgs(const Container<Element, Allocator>& inputContainer)
{
copy(inputContainer.cbegin(), inputContainer.cend(), ostream_iterator<Element>(cout, sep));
cout << endl;
};
int main(int argc, char** argv) {
vector<int> v = { 1 ,2 ,3, 4 };
vector<int> v1;
copy(v.cbegin(), v.cend(), back_inserter(v1));
displayContents(v1);
displayContentsWithDefaultArgs(v1);
displayContentsWithDefaultTemplateArgs(v1);
return 0;
}
как о: 'шаблон <шаблон <имяТип, имяТип> класс Container, класс Element, класс Allocator, класс Сентябрь = Const символ *> недействительного displayContentsWithDefaultTemplateArgs (const Контейнер <Элемент, Аллокатор> & inputContainer, Sep sep = ",") '? –
Технически это работает и соответствует тому, что я просил. Если вы хотите записать его, я соглашусь с ним, пока никто не может найти решение, которое просто использует аргументы шаблона аргумента за 24 часа. –
Примечание: это должен быть 'template void display ... (const Container &)' и использовать 'typename Container :: value_type' внутри. –