相关疑难解决方法(0)

如何防止非专业模板实例化?

我有一个模板化class(称之为Foo),它有几个特化.如果有人试图使用非专业版本,我希望编译失败Foo.

这是我实际拥有的:

template <typename Type>
class Foo
{
  Foo() { cannot_instantiate_an_unspecialized_Foo(); }

  // This method is NEVER defined to prevent linking.
  // Its name was chosen to provide a clear explanation why the compilation failed.
  void cannot_instantiate_an_unspecialized_Foo();
};

template <>
class Foo<int>
{    };

template <>
class Foo<double>
{    };
Run Code Online (Sandbox Code Playgroud)

以便:

int main()
{
  Foo<int> foo;
}
Run Code Online (Sandbox Code Playgroud)

适用时:

int main()
{
  Foo<char> foo;
}
Run Code Online (Sandbox Code Playgroud)

才不是.

显然,编译器链只在链接过程发生时才会抱怨.但有没有办法让它在之前抱怨?

我可以用boost.

c++ templates boost compilation

38
推荐指数
3
解决办法
5090
查看次数

SFINAE制作基本模板总是会导致错误

所以我正在设计一种my_numeric_cast函数来限制使用我正在编写的框架时可用的转换类型.

做类似的事情非常简单

template<typename To, typename From>
constexpr To my_numeric_cast(From);

template<>
constexpr float my_numeric_cast<float, int>(int i) { return i; }
Run Code Online (Sandbox Code Playgroud)

哪个工作,只允许在使用铸件时从整体铸造到浮子.并且每当尝试不在白名单中的演员表时产生链接错误.

但是,我真的想让这个编译错误,以更快地捕获滥用.
如何使基本模板体有效,在实例化时期望?

c++ sfinae template-meta-programming

5
推荐指数
1
解决办法
252
查看次数