给出如下的模板类:
template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
...
Type valueFor(const IDType& id) { // return value }
...
};
Run Code Online (Sandbox Code Playgroud)
有人如何在头文件中声明此类?
假设我有这些声明
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<>,也不允许 …
以下(建议!)语法是否有任何缺点?
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扣除结果类型.