当前位置: 首页 > 知识库问答 >
问题:

使用SFINAE、约束或概念限制专门化?

仰雅昶
2023-03-14
struct M; // forward declare so compiler will recognize this type
struct N;

template< typename J > struct B { template< typename U > void Func1(); };

template<> template<> void B< M >::Func1< M >() {}
template<> template<> void B< N >::Func1< N >() {}
template<> template<> void B< M >::Func1< N >() {} // illegal specialization for this app

template< typename J > struct C { template< typename U > void Func2(); };

template<> template<> void C< M >::Func2< M >() {}
template<> template<> void C< N >::Func2< N >() {}

template< typename G > struct H { G g; };

int main()
{
  H< B< M > > hbm;
  hbm.g.Func1< M >(); // ok
  hbm.g.Func1< N >(); // compiles and runs, but uses a semantically illegal specialization for this app

  H< B< N > > hbn;
  hbn.g.Func1< N >(); // ok

  H< C< M > > hcm;
  hcm.g.Func2< M >(); // ok

  H< C< N > > hcn;
  hcn.g.Func2< N >(); // ok

  return 0;
}

约束类型名J与类型名U相同的好方法是什么?

共有1个答案

陶成化
2023-03-14

可以使用enable_if:

template< typename J > struct B {     
    template<typename U>
    typename std::enable_if<std::is_same<U, J>::value, void>::type
    Func1();
};

http://coliru.stacked-crooked.com/a/efb499cf654f0f25

有了概念(在不久的将来不在标准中),与上面相同的解决方案将如下所示。

template <class T, class U> concept bool Same = std::is_same<T,U>::value;

template< typename J > struct B { 
    template< typename U > 
    requires Same<J, U>    
    void Func1(); 
};
 类似资料:
  • 文件有两个驱动程序:(运行时间为~3秒)和(运行时间为~83秒),当使用d专门化用-O3编译时。 其核心是:对于测试,加法代码被专用于s等上的向量,而对于则使用通用向量代码。在第10行,您可以看到GHC编写了的专用版本,而不是第167行的通用版本。专门化的规则在第225行。我相信这条规则应该会在270号线上开火。(调用,因此是应该专门化的地方。) 我的目标是通过专门化使与一样快。我找到了两种方法:

  • 这个问题演示了如何使用C++20概念为函数模板选择重载。我试图做一些类似的事情:为类模板选择专门化。 编译器将此附加实现视为使用不同约束对模板的重新声明。我尝试了几种不同的方式来表达我的意图,但没有一种能满足我所尝试的编译器。事实上,我甚至无法用和传统的SFINAE实现这一点--诚然,我完全有可能不太理解SFINAE。 我发现的唯一方法需要对每种整型和浮点型进行不同的专门化。 [是的,我知道还有几

  • 适用于类的语法不适用于概念: MSVC对“专门化”一行说:。 为什么概念不能专门化?有理论上的原因吗?

  • 例如,重载这两个: 因此,当被调用时,编译器将在每个调用中匹配正确的函数: 相关问题:概念会取代sfinae吗?

  • 在 MySQL 中,约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。 例如,在数据表中存放年龄的值时,如果存入 200、300 这些无效的值就毫无意义了。因此,使用约束来限定表中的数据范围是很有必要的。 在 MySQL 中,主要支持以下 6 种约束: 1)主键约束 主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置

  • PWM_limit 状态机根据解锁前和解锁后的输入控制PWM输出。并在”解锁“、油门加速和解锁信号的断言之间提供延迟。 快速概要 输入 armed: 置1使能诸如旋转螺旋桨的危险行为。 pre-armed: 置1使能诸如移动控制面的良性行为。 这个输入覆盖当前状态。 pre-aremd置1无视当前状态,立即强制转移到状态ON,值0则回复到当前状态。 状态 INIT和OFF pwm输出值设定为未解锁