【发布时间】:2016-05-23 03:05:45
【问题描述】:
我正在使用通用模板模板函数将容器输出到控制台。
为此,我希望提供一个默认分隔符。它可以将模板参数默认为 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;
}
【问题讨论】:
-
怎么样:
template <template <typename, typename > class Container, class Element, class Allocator, class Sep = const char*> void displayContentsWithDefaultTemplateArgs(const Container<Element, Allocator>& inputContainer, Sep sep = ",")? -
从技术上讲,它有效并且符合我的要求。如果你想写,我会接受,只要没有人能在 24 小时内拿出一个只使用模板参数默认值的解决方案。
-
旁注:这应该是
template<class Container> void display...(const Container&)并在里面使用typename Container::value_type。 -
字符串文字不能用作模板非类型参数,因此如果您想保留该用例,则必须使用函数参数。
标签: c++ templates c++11 stl stdstring