模板模板函数中的默认const char * template参数

时间:2016-02-12 03:57:59

标签: c++ templates c++11 stl stdstring

我正在使用通用模板模板函数将容器输出到控制台。

为此,我希望提供一个默认的分隔符。它将模板参数默认为const char(但后来我需要做一个愚蠢的字符串构造)或默认const char *函数参数(我知道这是一个非常好的解决方案,可能是首选)。

我想知道的是,是否有办法将模板参数默认为特定的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;
}

1 个答案:

答案 0 :(得分:2)

在我看来,您希望将两个单独的内容组合在一起:默认类型和该类型的默认变量 value 。但那是不可能的,对我来说似乎很合理。
稍微灵活的方法可以满足您的要求:

Iterable<? extends String> annoyingIterable = ...;
Iterable<String> niceIterable = new ArrayList<>(annoyingIterable);