2016-02-12 4 views
3

Я играю с общей шаблонной функцией шаблона для вывода контейнеров в консоль.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; 
} 
+2

как о: 'шаблон <шаблон <имяТип, имяТип> класс Container, класс Element, класс Allocator, класс Сентябрь = Const символ *> недействительного displayContentsWithDefaultTemplateArgs (const Контейнер <Элемент, Аллокатор> & inputContainer, Sep sep = ",") '? –

+0

Технически это работает и соответствует тому, что я просил. Если вы хотите записать его, я соглашусь с ним, пока никто не может найти решение, которое просто использует аргументы шаблона аргумента за 24 часа. –

+1

Примечание: это должен быть 'template void display ... (const Container &)' и использовать 'typename Container :: value_type' внутри. –

ответ

2

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

template <template <typename, typename > class Container, class Element, class Allocator, class Sep = const char*> 
void displayContentsWithDefaultTemplateArgs(const Container<Element, Allocator>& inputContainer, Sep sep = ",") 
{ 
    copy(inputContainer.cbegin(), inputContainer.cend(), ostream_iterator<Element>(cout, sep)); 
    cout << endl; 
}; 
Смежные вопросы