C++ 调用运算符()时是否可以提供模板参数?
我想使用一个模板C++ 调用运算符()时是否可以提供模板参数?,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我想使用一个模板操作符(),但不确定是否可行。下面是一个不会编译的简单测试用例。我的语法是否有问题,或者这根本不可能 struct A { template<typename T> void f() { } template<typename T> void operator()() { } }; int main() { A a; a.f<int>(); // This compiles. a.operator()&
操作符()
,但不确定是否可行。下面是一个不会编译的简单测试用例。我的语法是否有问题,或者这根本不可能
struct A {
template<typename T> void f() { }
template<typename T> void operator()() { }
};
int main() {
A a;
a.f<int>(); // This compiles.
a.operator()<int>(); // This compiles.
a<int>(); // This won't compile.
return 0;
}
结构A{
模板void f(){}
模板无效运算符()({}
};
int main(){
A A;
a、 f();//这是编译的。
a、 运算符()();//这将编译。
a();//这将无法编译。
返回0;
}
就像chris在评论中提到的那样,不,不是用速记语法。您必须使用完整的
.operator()
语法 > P>你想使用的确切语法在C++语言中是不可能的。
根据您试图解决的实际问题(这不是问题),我至少可以想到三个选项:
- 使用命名函数而不是运算符
- 模板
,而不是运算符本身A
- 使用详细的拼写调用
(我不太喜欢这个选项)操作符()
操作符()
并且想避免编写像a.operator()这样的结构代码>您可以向其添加一个辅助参数:
template <typename T>
struct type{};
struct A
{
template<typename T>
void operator()(type<T>) { }
};
int main()
{
A a;
a(type<int>());
}
模板
结构类型{};
结构A
{
模板
void运算符()(类型){}
};
int main()
{
A A;
a(type());
}
在C++14中,您甚至可以省略a(type())中的空括号代码>通过变量模板:
template <typename T>
struct type_{};
template <typename T>
constexpr type_<T> type{};
struct A
{
template<typename T>
void operator()(type_<T>) { }
};
int main()
{
A a;
a(type<int>);
}
模板
结构类型{};
模板
constexpr type_utype{};
结构A
{
模板
void运算符()(类型{}
};
int main()
{
A A;
a型;
}
.不使用速记语法,不,[编辑]你能告诉我们操作符如何使用T
?@MarkB仅举一个例子:抛出T
或返回T
(这里不是这种情况,但也不会推断)。你想做什么?似乎您试图使用错误的工具。@Paul您是说函数的实现取决于T
还是签名取决于?如果签名依赖于模板,那么模板类型推断可能是可能的(但在某些情况下并非如此)。一个技巧(并非总是可能的)是添加一个仅用于类型推断的伪参数,如operator()(T dummy)
,然后用a(int())
调用它。它将被优化,因此不涉及运行时开销,但它需要T
拥有一个没有副作用的默认构造函数。但我不确定这是否真的比a.operator()