我想在单调模板类中创建静态函数,以便能够扣除模板类的类型。 问题是,从模板类调用静态函数需要显式类型。 我想出的唯一解决方法是使用模板函数,而不是模板成员函数。
这里是一个例子。问题是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
}
答案 0 :(得分:1)
理论上可以使用注入的类名来请求语法。这将使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
越简单越好。
答案 1 :(得分:0)
我必须承认,我不完全了解您要做什么。但是,您可以执行以下两个操作之一:
struct foo {
template <typename T>
static T deduce(const T& t) {
return {};
}
};
template <typename T>
T deduce_free(const T& t) {
return {};
}
int main() {
auto x = foo::deduce(1);
auto y = deduce_free(1);
}
但是,在知道bar<T>
是什么之前,您无法在T
的某些实例上调用方法(是否为静态)。
对于具有class template argument deduction的C ++ 17,情况有所改变,尽管据我所知,它对构造函数有效,所以您仍然需要先使用我对此没什么经验,所以没说错什么;)。foo<int>
打电话给foo<int>::deduce()