c++ - 模板静态函数模板类类型推导
问题描述
我想在单调模板类中制作静态函数,可以扣除模板类的类型。问题是,从模板类调用静态函数需要显式类型。我想出的唯一解决方法是模板函数,而不是模板成员函数。
这是一个例子。问题是 foo4 部分不起作用
template <class T>
class Foo
{
private:
Foo() {}
Foo(const Foo&) = delete;
Foo& operator= (const Foo&) = delete;
public:
static auto& Instance()
{
static Foo foo{};
return foo;
}
template<class K> static
auto& DeductInstance(const K&)
{
static Foo<K> foo{};
return foo;
}
};
template<class K>
auto& DeductInstance(const K&)
{
return Foo<K>::Instance();
}
void main()
{
auto& foo1 = Foo<int>::Instance(); //OK
auto& foo2 = Foo<int>::Instance(); //OK (return same example as foo1)
auto& foo3 = DeductInstance(123); //OK
auto& foo4 = Foo::DeductInstance(123); //NOT WORKING
}
解决方案
您要求的语法在理论上可以使用注入的类名。这将Foo::
解决一个特定的、不相关的Foo<x>::
. 这是一个例子:
struct BaseFoo {
template<class K> static
auto& DeductInstance(const K&);
};
template <class T>
struct Foo {
static auto& Instance() {
static Foo foo{};
return foo;
}
};
template<>
struct Foo<void> : private BaseFoo {
using BaseFoo::DeductInstance;
};
template<typename K>
auto& BaseFoo::DeductInstance(const K&)
{
return Foo<K>::Instance();
}
using MakeFooAvailable = Foo<void>;
struct Dummy : MakeFooAvailable {
auto& bar() {
// Syntax working
return Foo::DeductInstance(234);
}
};
在类Dummy
中,基类有一个注入的类名,将其Foo
解析为Foo<void>
. 然后,在其范围Foo<void>
内BaseFoo::DeductInstance
提供名称解析。
我建议不要使用此解决方案,因为它很聪明。聪明通常意味着令人惊讶。程序员不希望看到Foo
它是一个非模板。我认为最好的解决方案是:
auto& foo1 = Foo<int>::Instance(); //OK
越简单越好。
推荐阅读
- .net-core - Dapr 服务总线队列输出绑定无法将用户属性设置为
- javascript - 在 Phaser 3 v3.54.0 中拖放图像不拖动
- java - jumbledString:给定一个字符串 s 和一个数字 n,编写一个函数,将偶数索引字符连接到前面
- java - 如何在 Java Swing 中反转 RowFilter 工作
- azure - Azure 数据工厂接收器中的键列字段
- node.js - 以管理员身份安装后,“express”不被识别为内部或外部命令
- python - 我想在 Django 中注册(以编程方式)时将用户分组为管理员或客户。我是 Django 新手
- django - request.POST 中的数据未用于在视图中填写 django 表单
- function - 从 Windows 批处理将参数传递给 SQLPLUS 包函数
- git - 具有多个来源并允许其中之一访问不同目录的 Git