c++ - 如何使用类型特征仅比较具有多个参数的类中的第一个模板参数?

标签 c++ c++11 type-traits static-assert

所以我有这个功能,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) {}

DEMO 1

选项#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) {}

DEMO 2

关于c++ - 如何使用类型特征仅比较具有多个参数的类中的第一个模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018236/

相关文章:

c++ - 为什么显式运算符 bool 让我转换为任何原始类型?

c++ - 编译器生成的 Action 的实现

类方法 : partial specialization if parameter is enum 上的 C++ 类型特征

c++ - 记录我的 C++ 类型是可 memcopyable 且 noop 可破坏的

c++ - 如何编写类似于 std::make_tuple 的 make_vector?

C++ 检查挂载路径是否仍然挂载

c++ - 该程序应显示输入等于倒数

c++ - 在现有的visual studio 2017中下载c++

c++ - 为什么我们不能从派生类中调用 protected 析构函数?