【问题标题】:Specify integral template argument of constructor template inside a class template在类模板中指定构造函数模板的整体模板参数
【发布时间】:2015-05-05 05:08:29
【问题描述】:

我正在为union(而不是struct)创建一个等效的std::tuple。为此,我还添加了一个构造函数模板,其中第一个模板参数是 size_t idx,以初始化 union 的 idxth 元素。此外,还有另一个variadic template 来指定实际类型构造函数的参数是什么。

不幸的是,在调用构造函数时,我似乎无法指定 idx 模板参数,而且它也不是隐含的(因为它不是参数列表的一部分)。有没有办法解决?如何指定 size_t 构造函数模板参数?

示例代码:

#include <iostream>

template<typename T>
struct Foo
{
    T d_val;
    size_t d_other_val;
    template<size_t idx>
    Foo(T val)
    {
        d_val = val;
        d_other_val = idx;
    }
};


int main() {
    Foo<double> f = Foo<4>(2.6);

    std::cout << f.d_val << " " << f.d_other_val << '\n';
}

来源:http://ideone.com/UeBvF5

当然,4 匹配的是类模板,而不是构造函数模板。这是可以修复的吗?请注意, idx 应该是编译时的东西,而不是普通的构造函数参数。尽管在本例中,这只是简单的解决方案。

PS:问题当然是,构造函数模板通常隐含在调用构造函数的参数中。据我所知,隐式规范对于 idx 模板参数是不可能的。

【问题讨论】:

  • 模板参数应该为构造函数推导出来。
  • “虽然在这个例子中,这将是微不足道的解决方案。” - 那么,你能给我们举一个更好的例子吗?如果不能推导出参数,我看不出使用模板的意义。
  • @KarolyHorvath 我认为这需要相当多的代码,至少,我想不出一个简单的例子。但是,考虑将联合实现为类模板,并使用可变参数模板参数指定联合成员。然后,构造函数模板的 size_t 模板参数用于指定应该初始化这些联合成员中的哪些。这可以在运行时完成,但是构造函数也需要进行运行时递归,理论上可以在编译时完成。
  • @Herbert: 嗯.. 使用工厂?
  • 是的,我现在或多或少正在使用工厂,但构造函数会更简单:)

标签: c++ templates c++11 constructor


【解决方案1】:

[temp.arg.explicit]/7 读作:

[ 注意: 因为显式模板参数列表遵循函数模板名称,并且因为转换 成员函数模板和构造函数成员函数模板在调用时不使用 函数名,无法为这些函数模板提供显式的模板参数列表。 ——尾注 ]

因此,您必须将size_t idx 作为常规参数传递,或者将其添加为struct Foo 的模板参数。

【讨论】:

  • 要明确:这不是解决方案,只是解释为什么没有解决方案。我觉得有点不幸,因为这只是语法原因,还是我遗漏了什么?
  • @Herbert 是的,可以将其视为纯语法的原因:您不能为没有名称的函数指定模板参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多