首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SFINAE检查“模板类”(在模板参数中)

SFINAE检查“模板类”(在模板参数中)
EN

Stack Overflow用户
提问于 2017-05-08 08:33:12
回答 1查看 345关注 0票数 4

如何在模板参数中检查模板模板类的类型?

示例

B<T>C<T>是模板类。

我想要创建一个类D<class BC>,它可以是D<B>D<C>

只有D<B>D::f()

这是我的解决办法(演示)。它起作用了。

代码语言:javascript
复制
#include <iostream>
using namespace std;
class Dummy{};
template<class T>class B{};
template<class T>class C{};
template<template<class T> class BC>class D{
    //f() is instantiated only if "BC" == "B"
    public: template<class BCLocal=BC<Dummy>> static
    typename std::enable_if<std::is_same<BCLocal,B<Dummy>>::value,void>::type f(){  
    }
    //^ #1
};
int main() {
    D<B>::f();
    //D<C>::f();   //compile error as expected, which is good
    return 0;
} 

#1的行非常长,很难看(使用Dummy进行黑客攻击)。

在实际程序中,它也很容易出错,特别是当B<...>C<...>可以有5-7模板参数时.

有什么办法可以改进吗?

我的梦想是:-

代码语言:javascript
复制
template<class BCLocal=BC> static
    typename std::enable_if<std::is_same<BCLocal,B>::value,void>::type f(){ 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-08 08:39:53

为什么不直接将比较提取到一个方便的实用工具中呢?

代码语言:javascript
复制
#include <type_traits>

template<template<class...> class L, template<class...> class R>
struct is_same_temp : std::false_type {};

template<template<class...> class T>
struct is_same_temp<T, T> : std::true_type {};

然后,f上的SFINAE可以简单地如下所示:

代码语言:javascript
复制
static auto f() -> typename std::enable_if<is_same_temp<BC, B>::value>::type {
}

不需要为void指定enable_if,因为它是它提供的默认类型。

而后来者型也有美化效果,我想。

有了C++14,我们可以进一步美化。首先是可变模板。

代码语言:javascript
复制
template<template<class...> class L, template<class...> class R>
using bool const is_same_temp_v = is_same_temp<L, R>::value;

然后使用std::enable_if_t模板别名:

代码语言:javascript
复制
static auto f() -> std::enable_if_t<is_same_temp_v<BC, B>> {
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43843114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档