模板重载和 SFINAE 仅适用于函数而不是类
template overloading and SFINAE working only with functions but not classes
有人可以解释为什么编译器只接受这段代码吗
template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
void a_function(){}
template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
void a_function(){}
但不是这个:
template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
class a_class{};
template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
class a_class{};
编译器将第二个类模板视为第一个类模板的重新定义。
您必须对类使用专业化。通常,它是使用一个额外的参数完成的:
template <class P, class dummy = void>
class T;
template <class P>
class T<P, typename enable_if<something, void>::type> {
the real thing
};
具有相同名称的两个类(或类模板(声明应始终声明相同的类或类模板(或者是专用化,在这种情况下它仍然是相同的模板(。
你可能想做这样的事情(ideone.com 链接(:
#include <iostream>
template< typename PL, size_t pOffset, int pC = int( sizeof(PL) ) - int( pOffset ) >= 0 ? ( int( sizeof(PL) ) - int( pOffset ) == 0 ? 0 : 1 ) : -1 >
class TClass
{
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, -1 >
{
public:
static int const sI = -1;
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 0 >
{
public:
static int const sI = 0;
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 1 >
{
public:
static int const sI = 1;
};
int main(void )
{
TClass< char, 0 > lC0;
TClass< char, 1 > lC1;
TClass< char, 2 > lC2;
std::cout << lC0.sI << " : " << lC1.sI << " : " << lC2.sI << std::endl;
return ( 0 );
}
程序输出:
1 : 0 : -1
相关文章:
- 使用一个参数的模板函数时出错(适用于 2)
- 模板函数仅适用于VS
- 如何使此函数适用于 100 个对象 (c++)?
- 没有适用于 std::unique_ptr 的适当默认构造函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 如何创建适用于 lambda 表达式的排序函数
- Qt C++macOS问题。我正在使用函数 .find( "a word") 在多集中搜索单词,它适用于 Windows 但不适用于 mac
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 为什么模板函数只基于返回类型适用于C++
- 是否有适用于 stream2 或 stream3 函数的代码
- 为什么OpenCV构造函数适用于iPhone5而不适用于iPhone6/iPad
- 声明引用适用于类,但不适用于主函数
- 为什么函数模板不理解 NULL,但适用于 nullptr
- 如何获取 Linux 中 mmap() 函数的 FileDescriptor 的内存地址,适用于 Video4Linux
- 在构造函数类中初始化 ofstream,仅适用于 c++11
- C++模板机制来获取函数参数的数量,这将适用于 lambda 和普通函数
- 名称篡改是否适用于c++中的虚拟函数
- 如何在新程序中包含来自其他c++文件的函数(适用于Mac OSX应用程序)