【发布时间】:2015-11-13 07:22:27
【问题描述】:
在对这篇帖子“(Partially) specializing a non-type template parameter of dependent type”的回答中,它指出:
模板参数的类型对应于一个专门的 非类型参数不应依赖于 专业化。 [ 例子:
template <class T, T t> struct C {}; template <class T> struct C<T, 1>; // error template< int X, int (*array_ptr)[X] > class A {}; int array[5]; template< int X > class A<X,&array> { }; // error——结束示例]
我的问题是为什么这里有这个限制?至少在一个用例中,我发现此限制会干扰编写干净的代码。例如
template <typename T, T*>
struct test;
template <typename T>
struct test<T, nullptr> // or struct test<T, (T*)nullptr>
{
};
template <typename R, typename...ARGs, R(*fn)(ARGs...)>
struct test<R(ARGs...), fn>
{
};
虽然我不确定是否还有其他情况表明基于类型声明常量是一个没有任何意义的问题。
有人知道为什么会这样吗?
【问题讨论】:
-
我的意思是我认为如果你有一堆类型有例如
static const int value = 42;和其他一些具有static const char value = 'a'的类型,那么您可能可以部分专门化基于<typename T, T::v>的模板...我想不出任何特定的限制原因,我不认为允许那种替换和模式匹配会比他们已经做的更难。但也许我错过了一些东西。 -
FWIW 可能没有真正的答案。该标准还说“您不应将指针指向构造函数”,并且 afaik 没有特别令人信服的理由来限制这种限制
-
@ChrisBeck 这更合理和可以理解。构造函数的对象需要内存,因此在调用之前需要隐藏代码。这种分配可以直接在调用之前,也可以在编译器定义的任何其他地方之前。调用构造函数而不说明对象的存储位置是没有意义的,因此指向构造函数的指针不仅没有意义,而且非常危险。 Inplace
new允许程序员指定内存位置,前提是这种细粒度使用实际上是有保证的,并且可以生成工厂函数来代替构造函数。 -
@ChrisBeck 这将是您的函数:
template <typename CLASS, typename...ARGs> CLASS factory(ARGs&&...args) { return CLASS(std::forward<ARGs...>(args...)); }您的函数指针将是auto pConstrutor = &factory<class_name, arg0_t, ..., argN_t>,而您的调用将是class_name var = pConstructor(arg0, ..., argN)。这将是我在这个 OT 线程中的最后一篇文章 -
@T.C. : 从 N0668 的最后一页开始,他们给出了一个算法来确定哪些类的部分模板特化比其他的更具体,它基本上将非类型参数分开处理,并将早期的函数模板算法用于类型参数。我猜如果非类型参数的类型取决于类型参数,这将不起作用。所以我的假设是,标准委员会只是觉得它为编译器编写者节省了大量工作来禁止这样做?这听起来合理吗?
标签: c++ templates c++11 c++14 template-meta-programming