如何使用类型特征来比较具有多个参数的类中的第一个模板参数?
How can I use type traits to compare only the first template parameter in class that has multiple parameters?
我有这个函数GetProperty()
,它的定义如下:
template<typename T>
void GetProperty(T & val)
我想让它接受三个可能的值:bool
, int
,和一个有两个模板参数的字符串类。字符串类,我们称之为StringT
,看起来像这样:
template<typename CharType, size_t Size>
class StringT
我希望能够将StringT
的实例传递给GetProperty()
,以便它只检查CharType
并允许Size
的任何值。例如,这两个调用都应该在没有任何额外专门化的情况下工作:
StringT<char, 512> str1;
GetProperty(str1);
StringT<char, 1024> str2;
GetProperty(str2);
当前的实现是这样的:
template<typename T>
void GetProperty(T & val)
{
// Trying to use static_assert to only allow StringT values in the default implementation.
static_assert(std::is_same<T, StringT<char, 512>>::value, "FAILED");
// Do stuff
}
template<>
void GetProperty<bool>(bool & val)
{
// Do stuff
}
template<>
void GetProperty<int>(int & val)
{
// Do stuff
}
显然这不起作用,因为它只允许指定StringT<char, 512>
类型。是否有任何方法可以忽略512
模板参数并让它接受Size
的任何值?
选项#1
为每个类型提供单独的函数重载,这样您就可以在一个重载中接受任何StringT<char, ?>
:
template <size_t N>
void GetProperty(StringT<char, N>& val) {}
void GetProperty(bool val) {}
void GetProperty(int val) {}
演示1
选项# 2
写你自己的type-trait:
#include <type_traits>
template <typename S, typename C>
struct IsStringT : std::false_type {};
template <typename C, size_t Size>
struct IsStringT<StringT<C, Size>, C> : std::true_type {};
template <typename T>
void GetProperty(T & val)
{
static_assert(IsStringT<typename std::remove_cv<T>::type, char>{}, "FAILED");
}
template <>
void GetProperty<bool>(bool & val) {}
template <>
void GetProperty<int>(int & val) {}
演示2
如果您可以控制StringT
类,则可以在公共部分添加额外的字段,其效果为:
using char_t = CharType;
那么你可以将你的静态断言更新为:
static_assert(std::is_same<typename T::char_t, char>::value, "FAILED");
在这种情况下,任何定义了char_t
的类都可以在这里使用。
GetProperty
总是与StringT
一起使用,你可以将它的最外层定义更改为:
template<typename CharType, size_t Size>
void GetProperty(StringT<CharType,Size> & val)
…然后你可以直接访问CharType
.
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将可变参数从一个函数传递到另一个函数
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 将参数从一个函数传递到另一个函数(没有模板) - C++
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 将参数初始化为构造函数,而不是第一个