模板模板函数中的默认 const char* 模板参数
default const char* template argument in a template template function
我正在使用一个通用模板模板函数将容器输出到控制台。
为此,我希望提供一个默认的分隔符。它将模板参数默认为 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 = ",")
{
copy(inputContainer.cbegin(), inputContainer.cend(), ostream_iterator<Element>(cout, sep));
cout << endl;
};
相关文章:
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 从 C# GUI 将 char * 参数传递给C++ dll 函数
- Swift Call C 方法带有char **参数,并且需要操作char **参数
- 使用"const char*"和"char*"参数连接两个第三方模块
- 将 char * 参数传递给 C# 函数
- 使用 char[] 参数通过 JNI 调用方法
- C# PInvoke - 返回 char* 和引用 char* 参数的函数
- 导出托管的C#函数将返回更改CHAR*参数为未托管的代码
- 即使在 Visual C++ 编译器中,在模板中传递 "const char" 参数也有些麻烦 2013 年 11 月 CTP
- 将'const char*'参数发送到接收'const char* &'的函数
- discover char*参数大小
- lambda接受“char”参数
- 在编译模板方面,char、有符号char或无符号char参数类型的函数重载
- 将类方法传递给const char*参数
- Atoi 仅返回 char* 参数的第一个数字
- 专门化模板成员函数来处理std::string和char[]参数
- 带有 char* 参数的 cout <<打印字符串,而不是指针值
- 带有char[]参数的c++模板
- GetModuleBaseName dosen't take char* 参数
- 以双精度数除以双精度数来获得循环中的余数和char参数不起作用