相关疑难解决方法(0)

如何转发声明一个C++模板类?

给出如下的模板类:

template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id) { // return value }
    ...
};
Run Code Online (Sandbox Code Playgroud)

有人如何在头文件中声明此类?

c++ templates forward-declaration

81
推荐指数
3
解决办法
6万
查看次数

使用SFINAE进行模板类专业化

假设我有这些声明

template<typename T> class User;
template<typename T> class Data;
Run Code Online (Sandbox Code Playgroud)

并且想要实现User<>for T = Data<some_type> 和派生的任何类,Data<some_type>但也允许在别处定义的其他特化.

如果我还没有类模板的声明User<>,我可以简单地说

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

哪里

template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };
Run Code Online (Sandbox Code Playgroud)

但是,这有两个模板参数,因此与前一个声明冲突,其中User<>声明只有一个模板参数.还有什么我可以做的吗?

(注意

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

不起作用(默认模板参数可能不在部分特化中使用),也不起作用

template<typename T> class User<Data<T>> { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

因为它不允许从中派生类型Data<>,也不允许 …

c++ templates sfinae c++11

37
推荐指数
3
解决办法
1万
查看次数

SFINAE:static_assert vs std :: enable_if

以下(建议!)语法是否有任何缺点?

template< typename T >
void f() static_assert(std::is_same< T, int >::value)
{ ; }
Run Code Online (Sandbox Code Playgroud)

而不是SFINAE(看起来像拐杖):

template< typename T, typename = typename std::enable_if< std::is_same< T, int >::value >::type >
void f() { ; }
Run Code Online (Sandbox Code Playgroud)

甚至更糟:

template< typename T >
typename std::enable_if< std::is_same< T, int >::value >::type 
f() 
{ ; }
Run Code Online (Sandbox Code Playgroud)

禁止使用auto扣除结果类型.

c++ sfinae c++14

19
推荐指数
2
解决办法
4957
查看次数

标签 统计

c++ ×3

sfinae ×2

templates ×2

c++11 ×1

c++14 ×1

forward-declaration ×1