我正在创建一个类,它编写代码字符串,字符串和字符串之间的区别仅仅是在basic_string中放入什么,所以我将把它写为一个模板类。
问题是,内部使用的文字字符串也必须根据类型而改变,所以我结合了宏和SFINAE来创建一个函数,根据类型返回不同的文字字符串。
但是我的代码有一个“没有函数模板的示例匹配参数列表”错误。
这是我的代码:
#include <filesystem>
#include <string>
#include <type_traits>
#include <fstream>
#include "windows.h"
namespace stdfs = std::filesystem;
template <typename T>
class CCodeWriter
{
public:
CCodeWriter() {};
~CCodeWriter() {};
private:
template <typename U = T, typename std::enable_if_t<std::is_same_v<U, wchar_t>, wchar_t>>
const std::basic_string_view<U> ConvString(const std::string_view _AstrView, const std::wstring_view _WstrView)
{
return _WstrView;
}
template <typename U = T, typename std::enable_if_t<std::is_same_v<U, char>, char>>
const std::basic_string_view<U> ConvString(const std::string_view _AstrView, const std::wstring_view _WstrView)
{
return _AstrView;
}
#define CONV_STRING(str) ConvString(str, L##str)
private:
int m_iIndentation;
std::basic_ofstream<T> m_ofs;
public:
HRESULT Open(stdfs::path const& _path) { return S_OK; }
bool IsOpen() const { return m_ofs.is_open(); }
void WriteCode(const std::basic_string_view<T> _strCode)
{
...
//Error
m_ofs << CONV_STRING("\t");
//Error
m_ofs << ConvString("\t", L"\t");
...
}
};
int main()
{
CCodeWriter<char> writer;
writer.WriteCode("HI");
return 0;
}
除了用手写每个文字字符串之外,没有其他方法吗?
我试图改变参数类型,但我不熟悉SFINAE,所以我尝试的一切都有错误。
我所期望的是,由于SFINAE的属性,当输入类型时返回文字“\t”,当输入类型时返回文字L”\t”<wchar_t>。
有可能吗?
1条答案
按热度按时间pbgvytdp1#
您的
enable_if
用法不正确,一种可能的用法是目前,当
T
为char
时,SFINAE重载如下所示因此,显然不能推导出第二
char
非类型模板参数。在C++17及更高版本中,可以简单地使用
if constexpr
您还可以使用
std::char_traits<T>::to_char_type('\n')
将'\n'
转换为适当的字符类型。这应该适用于基本字符(特别是\n
和\t
)。