如何让编译器在指针上选择模板的静态数组版本
How to have compiler choose static array version of template over pointer?
我正在尝试做一些接近于此的事情:
template<typename TChar, size_t TSize>
inline size_t StringLength(TChar(&)[TSize])
{
return TSize - 1;
}
template<typename TChar>
inline size_t StringLength(const TChar* value)
{
return std::char_traits<TChar>::length(value);
}
。但是当调用 StringLength("abc") 时,编译器发现它不明确:
test.cpp(15): could be 'size_t StringLength<char>(const TChar *const )'
with
[
TChar=char
]
test.cpp(9): or 'size_t StringLength<const char,4>(TChar (&)[4])'
with
[
TChar=const char
]
while trying to match the argument list '(const char [4])'
(此测试在VS2013中完成。
我只是想在尺寸可用时避免使用strlen。有没有办法做到这一点,或者比我正在尝试的更好的选择?
只需通过 const 引用获取指针,这会阻止模板参数推导期间数组到指针的转换:
template<typename TChar>
inline size_t StringLength(const TChar* const & value)
//^^^^^^^
{
return std::char_traits<TChar>::length(value);
}
演示。
这种方式有效:
#include <cstddef>
#include <iostream>
#include <string>
#include <type_traits>
template<typename TChar, std::size_t TSize>
inline std::size_t StringLength(TChar(&)[TSize])
{
return TSize;
}
template<typename TCharArray> // v-- using SFINAE to disable this overload if TCharArray is not an array type
inline std::size_t StringLength(TCharArray value, typename std::enable_if<!std::is_array<TCharArray>::value, void>::type * = nullptr)
{
return std::char_traits<typename std::remove_pointer<TCharArray>::type>::length(value);
}
int main() {
std::cout << StringLength("foo") << "n";
char const *ptr = "foo";
std::cout << StringLength(ptr) << "n";
}
。但是你确定这是一个好主意吗?我知道你想避免这个讨论,但它是...硬。我的意思是,考虑
char str[100] = "foo";
std::cout << StringLength(str); // will give 100.
它并不完全符合 POLA 标准。
相关文章:
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- GCC:--静态链接到pthread的整个存档配方在最近的GCC版本中停止工作
- 用静态版本的QT编译时,文件对话框崩溃
- 拥有相同方法的静态和非静态版本是不是设计不好
- 没有配置文件来制作QT的静态版本
- 如果仅在 lambda 中使用,则不会在发布版本中初始化局部静态变量
- 使用Visual Studio 2013构建QT 5.2.1的静态版本
- G 无法链接共享对象的静态版本
- 静态Qt链接版本,Qt 5.2,QT中的未知模块:快速qml
- 拥有具有相同名称的库的静态和动态版本是一种常见的做法
- 内部在具有不同版本的Visual Studio的静态LIB中使用STL
- C++:将静态类成员与静态类成员的传递版本进行比较
- 两个使用不同libstdc++版本的静态库
- 如何静态链接到两个版本的 xerces-c(或任何与此相关的库)
- C/C++ 尝试创建共享库时出错.创建库的静态版本时不会发生错误
- 如何让编译器在指针上选择模板的静态数组版本
- 使用模板元编程实现 std::all_of 的静态版本
- 是否有一个模板可以生成类的静态/动态绑定版本
- 如何使用Qt的静态构建为Windows创建静态链接版本
- 如何使用代码块为MIGW构建64位版本的Oracle OCI静态库(libocia/w/m.a)