所以我有这个功能,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) {}
选项#2
写下你自己的类型特征:
#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) {}
关于c++ - 如何使用类型特征仅比较具有多个参数的类中的第一个模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018236/