在以下代码中:
#include<iostream>
#include<cstdlib>
#include<type_traits>
using std::enable_if;
using std::is_same;
using std::cout;
using std::endl;
template<typename T>
struct S{
S(){t = static_cast<T>(NULL);}
template<typename U,typename enable_if<is_same<T,U>::value>::type>void operator()(U&& rrU){t = rrU;}
T t;
};
int main(){
S<int> s;
return(0);
}
在operator()
中实例化模板结构后,如何实例化并使用模板结构中定义的main()
模板方法?
答案 0 :(得分:0)
我必须承认,我不太确定你想要达到的目标,但类型将在编译过程中推断,因此你不会# 39;不必担心。无论如何,我会按如下方式实现你的例子(这是基于我对你的意图的理解):
/** @file: test.cpp */
#include <utility>
#include <type_traits>
template <typename T>
struct S {
S() : t(0) { };
template <typename U>
void operator()(U &&rrU) {
static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T");
t = rrU;
}
T t;
};
int main() {
S<int> s;
int a = 10;
s(std::move(a));
#ifdef RAISES_ERROR
double b = 10.0;
s(std::move(b));
#endif
return (0);
}
这可以通过两种方式编译:
g++ -std=c++11 test.cpp
编译好,第二种情况引发编译错误(这就是你想要的吗?),但错误可以解释清楚:
g++ -std=c++11 -DRAISES_ERROR test.cpp
test.cpp: In instantiation of ‘void S<T>::operator()(U&&) [with U = double; T = int]’:
test.cpp:26:17: required from here
test.cpp:12:5: error: static assertion failed: Error
static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T");
^