73 lines
1.2 KiB
C
73 lines
1.2 KiB
C
// { dg-options "-std=gnu++0x" }
|
|
|
|
#define ONE
|
|
#define TWO
|
|
#define THREE
|
|
|
|
struct Something {};
|
|
Something ___;
|
|
|
|
template <class F>
|
|
struct Trial
|
|
{
|
|
F f;
|
|
public:
|
|
Trial() : f() {}
|
|
Trial( const F& ff ) : f(ff) { }
|
|
template <typename... Args>
|
|
struct Sig { typedef int ResultType; };
|
|
|
|
template <typename... Args>
|
|
struct Sig<Something,Args...> { typedef int ResultType; };
|
|
|
|
#ifdef ONE
|
|
|
|
template <typename... Args>
|
|
typename Sig<Something,Args...>::ResultType operator()(const Something& s, const Args&... args) const
|
|
{
|
|
return f(args...);
|
|
}
|
|
#endif
|
|
#ifdef TWO
|
|
template <typename... Args>
|
|
typename Sig<Args...>::ResultType operator()(const Args&... args) const
|
|
{
|
|
return f(args...);
|
|
}
|
|
#endif
|
|
};
|
|
|
|
struct Internal
|
|
{
|
|
|
|
template <typename... Args>
|
|
struct Sig { typedef int ResultType; };
|
|
|
|
template <typename... Args>
|
|
struct Sig<Something,Args...> { typedef int ResultType; };
|
|
|
|
template <typename... Args>
|
|
int operator()(const Args&... args) const
|
|
{
|
|
int n = sizeof...(Args);
|
|
return n;
|
|
}
|
|
|
|
static Trial<Internal>& full() { static Trial<Internal> f; return f; }
|
|
};
|
|
|
|
static Trial<Internal>& internal = Internal::full();
|
|
|
|
int main()
|
|
{
|
|
int n = 0;
|
|
#ifdef ONE
|
|
n = internal(___,1,2);
|
|
#endif
|
|
#ifdef THREE
|
|
n = internal(___,1,2,3);
|
|
n = internal(___,1,2,3,4);
|
|
#endif
|
|
return 0;
|
|
}
|